ABB变频器恒压供水 昆仑通泰触摸屏与ACS510变频器直接485通讯程序一台变频器控制一台水泵 可供学习参考。
先说说硬件接线。ACS510的RS485口在端子排X1的29(P+)和30(N-),昆仑屏这边用DB9头的7、8脚。注意屏蔽层单端接地,实测距离超过50米建议加终端电阻。我之前在化工厂项目里遇到过信号干扰,后来发现是变频器接地线没接好,这坑大家别踩。
重点看参数设置(敲黑板):
# ACS510关键参数 99.02 = MODBUS # 协议选择 53.01 = 3 # 9600波特率 53.02 = 1 # 8数据位 53.03 = 2 # 停止位1.5 53.04 = 0 # 无校验触摸屏组态界面要特别注意这个设定:数据格式选16位无符号,高低字节顺序对调。有次调试压力值死活不对,最后发现是字节序搞反了。
上硬核代码——压力闭环控制核心:
// 读取当前压力值(寄存器40004) uint8_t readPressure[] = {0x01, 0x03, 0x00, 0x03, 0x00, 0x01, 0x74, 0x0B}; serial.Write(readPressure, 8); // 解析返回数据示例:01 03 02 01 F4 B5 C1 // 01地址 03功能码 02字节数 01F4转十进制500(单位0.01MPa) float realPressure = (data[3] << 8 | data[4]) * 0.01; // 写入目标频率(寄存器40002) uint16_t targetFreq = 3500; // 35.00Hz uint8_t writeFreq[] = { 0x01, 0x06, 0x00, 0x01, (uint8_t)(targetFreq >> 8), (uint8_t)(targetFreq & 0xFF), 0, 0 // 自动计算CRC }; calculateCRC(writeFreq, 6); serial.Write(writeFreq, 8);这个CRC校验函数坑过不少人,注意多项式是0xA001:
void calculateCRC(uint8_t *data, int len) { uint16_t crc = 0xFFFF; for(int pos=0; pos<len; pos++) { crc ^= (uint16_t)data[pos]; for(int i=8; i!=0; i--) { if((crc & 0x0001) != 0) { crc >>= 1; crc ^= 0xA001; } else { crc >>= 1; } } } data[len] = crc & 0xFF; data[len+1] = (crc >> 8) & 0xFF; }调试时建议先用Modscan验证通讯,遇到过寄存器地址偏移问题吗?ABB用的是4xxxx的Modbus地址,实际通讯时要减40001,比如40004对应03寄存器。
突发情况处理有个妙招:在触摸屏脚本里加个心跳检测,每5秒读取一次运行状态。发现超时立即切换备用泵,这个逻辑在自来水厂项目里救过急。
最后提醒:ACS510的启动命令(寄存器00001)是1字节操作,别手抖写成16位数据。曾经有个兄弟把启动命令写成0x0001,结果变频器直接报过流,别问我是怎么知道的...