高级会员

- 积分
- 993
- 金钱
- 993
- 注册时间
- 2017-8-11
- 在线时间
- 137 小时
|

楼主 |
发表于 2017-8-30 09:27:53
|
显示全部楼层
老铁,你的这个问题应该是没搞清楚如何去读、写某一个寄存器的某一位。如果在原有代码没有更改的情况下,出现你说的那种问题,很有可能就是在MODBUS POLL里的设置没设置对。这种情况有两种办法解决,要么设置正确的MODBUS POLL配置,要么修改你代码的寄存器顺序、地址。
我定义了一个保持寄存器的数组,结构如下
举例:
u16 usRegHoldingBuf[REG_HOLDING_NREGS]={0x0001,0x0002};
从机地址是 0X0A
eMBInit(MB_RTU,0x0A, 1, 9600, MB_PAR_NONE); //初始化FreeModbus
说明;
1、usRegHoldingBuf[REG_HOLDING_NREGS] 这个数组只有两个元素,分别是0x0001,0x0002
2、进行判断
if(usRegHoldingBuf[1]==0x01)
{
LED0=0;
delay_ms(1000);
delay_ms(500);
LED0=1;
usRegHoldingBuf[1]=0;
}
3、这里的判断,你没搞清楚。if(usRegHoldingBuf[1]==0x01)这里是判断第二个元素是否等于0x01,如果是,点灯。
如果写成if(usRegHoldingBuf[0]==0x01),这样就是判断第一个元素
再根据代码:
#define REG_HOLDING_START (USHORT)0x0000 //保持寄存器地址 03功能码
#define REG_HOLDING_NREGS (USHORT)2 //保持寄存器个数
代码搞清楚之后,就是MODBUS POLL里的设置问题,
进行16功能码写操作,根据以上的代码条件,保存寄存器地址为0x00,个数为2
后面就是对位数进行修改了
|
|