欧姆龙cp1h与台达变频器modbus rtu通讯程序。 程序有注释。 控制正反转、状态显示、写入频率和读取频率、电压,plc型号为cp1h-xa40dt-d,触摸屏为威纶通mt8071ie,变频器为台达vfd-m,实价
最近在工控项目里整了个活——用欧姆龙CP1H-XA40DT-D通过Modbus RTU控制台达VFD-M变频器。折腾了两天终于跑通了,分享点干货给兄弟们避坑。
硬件接线别翻车
CP1H的RS485口在自带端子排上(SDA、SDA-、RDA、RDA-),台达变频器的Modbus端子是+/-标注。这里有个细节:终端电阻记得在最后一台设备上加,屏蔽层接地要可靠。之前因为屏蔽层虚接导致通讯时好时坏,查了仨钟头才揪出来。
// PLC串口初始化 MOV #0000 D8126 // 设置通讯格式:9600,8,E,1 STUP #0 // 启动端口0这段代码往D8126寄存器写通讯参数。注意CP1H的串口配置必须和变频器参数P00(通讯地址)、P01(波特率)、P02(通讯格式)完全一致,否则连个寂寞。
正反转控制
台达VFD-M的正反转命令地址是2000H(十进制8192)。功能码06写单个寄存器:
// 正转命令 TXD #0 DM100 // 发送缓冲区首地址 #8 // 发送字节数 DM200 // 接收缓冲区 #100 // 超时时间发送缓冲区DM100开始的数据结构:
01 06 20 00 00 01 XX XX // XX为CRC校验码其中01是站号,06是功能码,2000拆分为两个字节,0001表示正转。反转时改成0002,停止0005。这里有个坑:台达的寄存器地址要减1换算,比如2000H实际填20 00而不是20 01。
频率设定骚操作
频率写入地址2001H,但要注意数据格式。比如要设定30.00Hz:
MOV #3000 D201 // 频率值放大100倍发送帧示例:
01 06 20 01 0B B8 XX XX // 0BB8十六进制转十进制即3000这里有个细节:CP1H的浮点数和Modbus整型转换需要处理,建议在触摸屏端做缩放,避免PLC做浮点运算拖慢速度。
状态读取三连击
状态读取用功能码03,连续读三个寄存器:
// 读取运行状态、频率、电压 TXD #0 DM300 // 发送缓冲区 #8 DM400 // 接收区 #100请求帧:
01 03 20 02 00 03 XX XX // 读取2002H开始的3个寄存器返回数据解析:
- 2002H:运行状态(位0=正转,位1=反转)
- 2003H:输出频率(单位0.01Hz)
- 200CH:直流电压(单位0.1V)
// 电压值处理 MOV DM405 D211 // 读取电压原始值 DIV D211 #10 // 转换为实际电压值触摸屏组态要点
威纶通MT8071IE这边要注意:
- 寄存器类型选D(DM区)
- 频率设定用D201寄存器,数据类型选16bit无符号
- 运行状态用D205的位状态元件
- 电压显示元件设置小数位数1位
调试时建议先关掉触摸屏,用PLC程序单独测试通讯。曾经有个兄弟因为触摸屏频繁读写导致通讯冲突,硬是换了轮询机制才解决。
最后提醒:台达变频器的Modbus响应有30ms左右延迟,程序里超时时间别设太短。遇到通讯失败先抓包,串口调试助手比PLC在线监控更直观。