有些老 PLC、老工控机和自制的单片机板子,到现在还在用 TC ASCII 这套串口协议(IMEW 的通讯协议可选 ASCII 或 Modbus)。它没有协议栈,就是一串可打印字符:谁发什么、回什么,全写在命令表里。用惯了Modbus 的人第一次接它,常卡在两处 —— 校验核怎么算,以及仪表不回话到底是谁的问题。
一、报文长什么样
一条命令由这几段拼起来:定界符、两位仪表地址、内容、常数、(数据)、校验核、回车符。最后那个回车是必须的,十六进制 0DH,少了仪表就当没收到。
定界符有六种,用来区分命令类型:井号、美元号、百分号、与号、单引号、双引号。其中井号用于读测量值,百分号用于设置参数,与号用于强制输出。记住这三个就够应付大多数场合。
二、几条最常用的命令
- 读测量值:定界符加两位地址,后面直接跟校验核和回车。这是最常用的一条。
- 读变送输出值:在读测量值的命令里加常数 0001,用来确认 4-20mA 实际输出多少。
- 读报警输出状态:常数改成 0003,一次性拿到几个报警点当前的通断状态。
- 读参数值 / 设参数值:需要给出参数地址,设参数时还要带数据段。
- 清零:有一条固定命令能同时清掉测量值、峰值和谷值。
同一条命令里,读测量值和读变送输出只差一个常数 —— 调试时用它来对账很方便:屏幕上显示多少、变送输出对应的电流是多少,两条命令一问就知道。
三、仪表的回答分三种开头
- 以等号开头:回应井号命令(读数据类)
- 以感叹号开头:回应单引号、美元号、百分号命令(参数类)
- 以大于号开头:回应与号命令(输出类)
看到开头符就知道是哪类命令的回应,解析时按这个分支处理,比按长度猜要可靠。
四、不回话和回问号是两回事
这两种情况要分开排查:
- 完全不回:没收到有效定界符或结束符、仪表地址不对、波特率不对、校验核不对。这四种都在「命令没能被正确解析」这一层,跟参数设置无关。
- 回一个问号加地址:命令收到了、解析了,但内容有问题 —— 命令长度不对、数据格式错、操作了硬件不支持的功能、读了未定义的参数,或者在下发输出命令时,报警/变送的控制权还在仪表手上(没交给计算机)。
最后一条特别容易踩:想用命令强制输出一个模拟量,但控制权参数没打开,仪表会老老实实回一个问号。这不是通讯故障,是权限没放。
五、校验核:就是个 ASCII 码求和
校验核不是必须的,可以用也可以不用。仪表会自动判断你发的命令里带不带,带了就回带校验核的回答,没带就不带。所以调试初期可以先不带,通了再加。
算法很简单:把命令里所有字符的 ASCII 值加起来,超过范围保留余数,用两位 40H 到 4FH 之间的 ASCII 字符表示,放在回车符前面。例如一条长度为五个字符的读值命令,各字符 ASCII 相加得到 E6H,拆成两位就是 4EH 和 46H,对应的可打印字符是 N 和 F。
回答的校验核算法略有不同:要在求和之后再加上本仪表的地址 ASCII 值。这一点和很多协议不一样,照搬命令侧的算法去校验回答,会一直判错。
六、结语
这套协议的价值在于简单 —— 一个串口助手就能调试,不需要任何库。代价是每个参数地址都要查表,写死在程序里。接老设备时它是最好用的桥,接新系统就没必要了。
