当前位置:首页 > 工业控制 > 工业控制
[导读]FX接温湿度、称重、激光测距、自制STM32/ARM模块,不强制走MC或Modbus时可用“无协议RS/NP”自定义帧。PLC当主站按站号轮询,第三方设备按私有帧应答,统一映射到D区;FX3U用RS指令、FX5U用无顺序通信功能块,参数和帧格式两边必须完全一致。


FX接温湿度、称重、激光测距、自制STM32/ARM模块,不强制走MC或Modbus时可用“无协议RS/NP”自定义帧。PLC当主站按站号轮询,第三方设备按私有帧应答,统一映射到D区;FX3U用RS指令、FX5U用无顺序通信功能块,参数和帧格式两边必须完全一致。

一、串口参数与PLC格式

RS-485接FX3U-485-BD/485ADP,常用9600~19200、8数据位、无校验、1停止位;若用计算机链接再改校验和站号。无协议写D8120,例如8N1/9600可配H0081类值,写后断电重启生效;具体位域按所用通道手册核对,别直接抄论坛常量。 RS-485两线A/B总线型,终端120Ω按距离加,半双工发收互斥。

二、自定义帧与PLC轮询

定义轻量二进制帧:0xAA+站号+功能码+长度+数据+CRC16。PLC用RS发请求,M8122触发发送、M8123收完置位需手动复位、M8129做超时。 ST示意:

// 初始化,仅上电一次

IF M8002 THEN

   MOV H0081 D8120;      // 无协议格式,按模块重算

   MOV K0 D0;            // 发送长度

END_IF;


// 500ms轮询下一站

IF T0 THEN

   INC D10; AND D10 K0F; // 站号1~15循环

   MOV K0AA D100;        // 帧头

   MOV D10  D101;        // 站号

   MOV K01  D102;        // 功能:读

   MOV K02  D103;        // 数据长度

   CALL CRC16 D100 K4 D104;// 计算CRC存D104~D105

   MOV K6 D0;            // 发送6字节

   SET M8122;

END_IF;


// 接收解析

IF M8123 THEN

   CALL ParseRx D200 D1; // 按站号/功能/CRC写D区

   RST M8123;

END_IF;

IF M8129 THEN

   // 超时:记错误计数,下一周期重发或跳站

   INC D20; RST M8129;

END_IF;

CRC16建议查表子程序,第三方向Modbus式校验靠齐;多传感器连续地址可一次读多点,减少RS调用次数。

三、嵌入式模块从站(Python桥接)

STM32/ARM如果用Python做调试网关或协议转换,pyserial按字节状态机收帧,断线重连、超时重发、写回FX映射值:

import serial, crcmod, time


crc16 = crcmod.mkCrcFun(0x18005, rev=True, initCrc=0xFFFF)

ser = serial.Serial('/dev/ttyUSB0', 9600, 8, 'N', 1, timeout=0.2)


def req(station, func, payload=b''):

   frame = bytes([0xAA, station, func, len(payload)]) + payload

   frame += crc16(frame).to_bytes(2, 'little')

   for _ in range(3):                     # 最多重发3次

       ser.write(frame)

       end = time.time() + 0.5

       buf = b''

       while time.time() < end:

           buf += ser.read(64)

           if len(buf) >= 6 and buf[0]==0xAA and crc16(buf[:-2])==int.from_bytes(buf[-2:],'little'):

               return buf

       time.sleep(0.1)

   return None


while True:

   r = req(1, 0x01, b'\x00\x00')         # 读传感器

   if r:

       val = int.from_bytes(r[4:6], 'little') / 10.0

       print('station1 value=', val)

   time.sleep(1.0)

从站固件别在串口中断里做完整业务,中断只入环形缓冲,主循环做帧头识别、长度、CRC、功能分发;RS-485要控制RE/DE,发前使能、发后切收,避免总线索赔。

四、可靠性落地

点表配置化:站号、功能码、寄存器地址、工程量零点/满度、单位、采集周期全部放参数区,新增传感器不改主逻辑。模拟量做死区、滑动平均,坏CRC/BCC直接丢帧并计通信质量;连续超时进“降级”,只保留关键报警。FX3U多站轮询周期按“帧长/波特率+从站响应+余量”估算,9600下每站几十毫秒较稳,十几个传感器总轮询可控制在1s内。若第三方本身支持Modbus RTU,FX3U-485ADP-MB直接用ADPRW更省事;纯私有协议才用RS自写帧。

调试先用串口助手单站发0xAA+站号+功能,确认应答CRC;再PLC单站通,最后全轮询。线序A/B反接、终端电阻缺失、D8120格式不对是三类高发问题,通电前用纸面参数表逐项核对可省大量现场时间。




本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭