自由口是 S7-200 SMART 串口的一种工作模式:PLC 不内置固定协议(如 Modbus/USS),工程师可按字节收发,自行定义报文格式与解析逻辑。
优先 Modbus:对端原生支持、寄存器清晰、生态成熟;
选择自由口:仅有 ASCII/私有协议、或需高度定制与兼容历史设备。
[帧头][地址][功能/命令][长度][数据...][校验] 1B 1B 1B 1B N B 1~2B (LRC/CRC16)
校验可用 LRC(逐字节求和取反)或 CRC16/0xA001。ASCII 设备多以CR/LF结尾,通常无需 CRC。
流程:口参数配置 → 发送(Send/XMT)→ 接收(Recv/RCV)→ 超时判帧 → 解析。
// 周期主程序 IF NewCmd THEN TxBuf := BuildFrame(CMD, Addr, Data); SendPort(Port:=0, pData:=TxBuf, Len:=TxLen); StartTimer(T_Resp); RxLen := 0; END_IF; // 接收与判帧 IF DataInPort0() THEN ReadByte := Port0Read(); RingPush(RxRing, ReadByte); LastByteTick := Now(); END_IF; IF (Now() - LastByteTick) > FrameGap OR RxLen = ExpectedLen THEN Frame := RingPopFrame(RxRing); IF CheckCRC(Frame) THEN Parse(Frame) ELSE IncErr(F_CRC) END_IF; END_IF;
接收中断把字节推入 环形缓冲,主程序只做判帧与解析,吞吐与稳定性更好。
// 接收中断 ISR_Port0_RX: b := Port0Read(); RB[Head] := b; Head := (Head + 1) MOD RB_SIZE; // 主程序 IF (Now() - LastByteTick) > FrameGap THEN Len := RB_ExtractFrame(RB, FrameBuf); IF Len > 0 THEN IF CheckCRC(FrameBuf) THEN Parse(FrameBuf) ELSE Err_CRC++ END_IF; END_IF; END_IF;
IF Port0_ByteReady THEN b := Port0Read(); IF b = 0x0D THEN SeenCR := TRUE; ELSIF SeenCR AND (b = 0x0A) THEN Line := Buffer; Clear(Buffer); NewLine := TRUE; SeenCR := FALSE; ELSE Append(Buffer, b); SeenCR := FALSE; END_IF; END_IF;
主站请求(示例):[0x55][ADDR][0x01][0x00][CRC_lo][CRC_hi]
从站响应:[0x55][ADDR][0x81][LEN][DATA...][CRC]
Tx[0] := 0x55; Tx[1] := Addr; Tx[2] := 0x01; // 读数命令 Tx[3] := 0x00; // 无数据 CRC := CRC16(Tx, 4); Tx[4] := Lo(CRC); Tx[5] := Hi(CRC); SendPort(Port:=0, pData:=Tx, Len:=6);
IF Rx[0]=0x55 AND Rx[1]=Addr AND Rx[2]=0x81 THEN L := Rx[3]; IF CheckCRC(Rx, 4+L+2) THEN Value := BytesToFloat(Rx[4..4+L-1]); // 或定点/整数 DB.Weight := Value; ELSE Err_CRC++; END_IF; END_IF;
FUNCTION CRC16(pData, Len) : WORD CRC := 0xFFFF; FOR i := 0 TO Len-1 DO CRC := CRC XOR pData[i]; FOR j := 0 TO 7 DO IF (CRC AND 0x0001) = 1 THEN CRC := (CRC >> 1) XOR 0xA001; ELSE CRC := (CRC >> 1); END_IF; END_FOR; END_FOR; RETURN CRC; END_FUNCTION
| # | 现象 | 处理 |
|---|---|---|
| 1 | 乱码/错帧频发 | 统一通信参数;改善接地/屏蔽;降波特率;缩线距强干扰源。 |
| 2 | 485 无响应 | 检查 A/B 是否反接;两端 120Ω;启用自动收发;禁止星形。 |
| 3 | 回显(Echo) | 半双工需正确 DE/RE;软件忽略短期内“自发帧”。 |
| 4 | 帧边界错判 | 二进制用“长度字段 + 超时”;ASCII 用 CR/LF。 |
| 5 | 丢帧/串台 | 接收中断 + 环形缓冲;避免长时间屏蔽中断;缓冲 ≥ 两帧。 |
| 6 | 多机抢答 | 主站严格轮询;从站地址匹配才应答;统一终端/偏置。 |
| 7 | CRC 失败 | 核对多项式/初值/字节序/校验范围。 |
| 8 | 电平不兼容 | TTL 需电平转换到 RS-232/485。 |
| 9 | 供地问题 | 信号地共地、避免多点环路;动力与通讯分槽。 |
| 10 | 协议歧义 | 统一字节序、缩放与单位;明确异常码/超时/重发策略。 |
自由口的本质是:稳定物理层(线缆/拓扑/接地) + 清晰帧设计(判帧/校验) + 健壮软件结构(中断缓存/状态机/超时重发)。按本文的接线、参数、示例与排故清单执行,S7-200 SMART 可与条码枪、称重仪、打印机及各类私有协议设备构建高可靠、可维护的通讯链路。