modbus与电表通讯累积充电量
时间:10-02
整理:3721RD
点击:
这里使用的是一块电力仪表。这块是三相的,但实际上使用一块单相的就可以了。
仪表大多使用是MODBUSRTU的通讯规约,而其中要使用的就是0x03功能码了。
0x03功能码的帧模式如下图:
这里的寄存器地址就是我们要读取的值了。
但是没有电力汽车,就没有电流了,电能值是不会增加的,读也不会改变的,所以就读取了电压值。
从说明书上找到对应的寄存器地址:
还有就是电能的寄存器,不过这里先不用这个了,其他的寄存器也暂时用不到。
转接板上将RS485与串口5连接在一起。在开发板上的程序就要使用到串口5了。
其中16位CRC校验程序:
- unsigned int formcrc16(unsigned char * startaddress, unsigned char bytecount)
- { unsigned char i, j
- unsigned int crc16value = 0xffff
- unsigned int polynomial = 0xa001
- for ( i = 0 i > 1 ) ^ polynomial
- else
- crc16value = crc16value >> 1
- }
- }
- return crc16value
- }
仪表的地址使用了默认的01.
那么对应的帧就是:0x010x03 0x9c 0x42 0x00 0x01 0x0A 0x4E
即读取电压寄存器一个寄存器中的值,后面的两个字节是用上面的程序计算出的CRC值。
打开串口5使用的是open函数。
fd = open("/dev/ttyO5", O_RDWR |O_NOCTTY);
其他部分程序:
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #define DATA_LEN 0xFF
- ......
- unsigned int MakeModbusData(char *data,char fun,unsigned char reg ,char L);
- unsigned int formcrc16(unsigned char * startaddress, unsigned char bytecount);
- unsigned int testmodbus(void)
- {
- char tmp[1024];
- int len;
- int fd, i;
- unsigned int Voltage ;
- fd = open("/dev/ttyO5", O_RDWR | O_NOCTTY);
- //生成Modbus帧数据,功能码03,寄存器地址0x9c42,寄存器数1个。
- len=MakeModbusData(tmp,0x03,0x9c42,0x01);
- write(fd, tmp, len);
- DisplayVoltage();//从帧中截取电压值打印到终端
- }
- ......
通过两条线将转接板上的RS485的A、B与电力仪表上的A、B一一对应连接。
给仪表上电后。在没有加电压时,电表显示为:
加上电压后,由于这块仪表是从现场拆回来的,可能是AD部分有点问题,但是通讯是正常的,由于项目中无法实现真正的电能累积,所以此部分作为理论验证,电压显示为:
转接板上的连接。
程序在开发板上进行读取电压值
小编厉害,学习了~感谢