大概明白了,第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);
- }
- .................
|