大概明白了,第1字节站号,第2字节功能码,第3,4字节是寄存器地址,当寄存器地址=3时触发某个功能,是吧?
我自己写的modbus就有这个功能,比如上位机触发打开某功能,关闭某功能,或者触发某个IO输出,
这是我的代码,当在modbus数据接收完成时,调用
ModbusHookCheck(addr,*(RecPtr+4));
struct modubs_hook_list hook_list[]={ //MODBUS位写入HOOK清单
{ModbusHookWriteY,((uint16_t *)&App.Data.Y[0]-&App.u16[0])*16,RegYlen*16},
{ModbusHookLockX,((uint16_t *)&App.Data.X[0]-&App.u16[0])*16,RegXlen*16},
//=9锁定标志 位0=锁定输入点 位1锁定工位1 位2锁定工位2 位3辅助逻辑锁定
{ModbusHookManual,((uint16_t *)&App.Data.M[9]-&App.u16[0])*16,16},
};
void ModbusHookCheck(uint16_t addr,int value){
for(int i=0;i<3;i++){
if(addr>=hook_list[i].start_addr && addr<(hook_list[i].start_addr+hook_list[i].addr_len)){
//相对地址
hook_list[i].func(addr-hook_list[i].start_addr,value);
}
}
}
void ModbusHookWriteY(int addr,int value){
SEGGER_RTT_printf(0,"GPIO Manual Y%d=%d\r\n",addr,value>0);
WriteY(addr,value);
}
.................
|
孩子,多大了?