S7-1200通过串口自由口协议与电力仪表专有协议的通信方法
西门子S7-1200、1500系列PLC的串口通讯,支持标准ModbusRTU协议,若遇到非ModbusRTU的其他协议,可通过自由口的方式来通讯。以下例程为S7-1200的RS485通讯模块,用自由口方式与电表通过DLT645-1997协议进行通讯,读取电表内“运行功率”及“累计电量”两个参数。
一、仪表的通信协议解析
1、从DLT645协议(文章后面有说明)进行协议解析,PLC需发送至电表的帧结构如下:
PLC正常接收电表返回的帧结构如下:
2、DLT645协议的具体协议内容
二、组态PLC串口模块
模块设置为2线制485,波特率1.2kbps(与电表设置一致),偶校验(固定设置),数据位8位(固定设置),停止位1位(固定设置),与电表及协议设置一致:
消息开始固定为16#68
消息结束固定为16#16;超过400ms未收到消息,也认为结束:
三、制作FB功能块DLTM,按照DLT645协议格式发送、接收数据
1、编组发送帧
按照DLT645的格式,将需发送到电表的14个byte数据放入数组SEND_PTP_SFB[1..14]中,并使用SEND_PTP功能块发送这14个byte。
使用SEND_PTP指令,发送以上编组好的SEND_PTP_SFB[1..14]共14个字节到串口
2、从串口接收数据,并处理接收帧:
从串口接收到的数据帧放入RCV_PTP_SFB数组中,若RCV_PTP_SFB[1..12]都与协议格式相同,且接收数据长度大于0,认为接收数据成功,将RCV_PTP_SFB[11]开始的2个数据放入READ_DATA数组中。
接收成功后,使用RCV_RST复位,并将接收数组RCV_PTP_SFB清零:
四、制作FB功能块DLT645,定义串口参数,定义功能码,并调用DLTM功能块
读取不同参数时使用不同的控制码:读取功率时用16#9010控制码,长度为2;读取电量时用16#B61F控制码,长度为2:
使用PORT_CFG指令初始化串口:
PORT为串口模块硬件地址;
PROTOCOL=1代表点对点通信协议(固定设置);
BAUD为波特率,通讯链路上所有电表都需设置一致;
PARITY=2代表偶校验(固定设置);
DATABITS=1代表字节数据位8(固定设置);
STOPBITS=1代表字节停止位0(固定设置);
FLOWCTRL=1代表无数据流控制(固定设置);
通过不同串口、读取不同电表、读取不同数据时,将不同的电表地址、数据标识通过块接口传入之前做好DLTM功能块:
五、在主程序中调用DLT645功能块,输入端口、波特率、电表地址等参数,与多台电表通讯时,需要轮询
例如:第1台电表的DLT645地址设置为010101010101:
六、通信协议的解析是通信应用能力的体现。