// 主程序
IF #firstScan THEN
// 初始化Modbus通信端口 (PORT=0, 波特率9600, 8N1)
#commLoad(
REQ := TRUE,
"PORT" := 0,
BAUD := 9600,
PARITY := 2, // 0=None, 1=Odd, 2=Even
MB_DB := #mbMaster);
#firstScan := FALSE;
// 初始化错误状态
FOR #i := 1 TO 20 DO
#errorStatus[#i] := FALSE;
#errorCount[#i] := 0;
END_FOR;
END_IF;
// 处理写请求 (高优先级)
IF #writeRequest THEN
#mode := 1; // 进入写模式
#currentSlave := #writeSlaveID;
// 执行写操作 (功能码6 - 写单个寄存器)
#mbMaster(
REQ := TRUE,
MB_ADDR := #writeSlaveID,
MODE := 1, // 写模式
DATA_ADDR := #writeAddress,
DATA_LEN := 1, // 写入1个寄存器
DATA_PTR := (#writeValue),
DONE => #tempDone,
ERROR => #tempError);
// 处理写结果
IF #tempDone OR #tempError THEN
#writeRequest := FALSE;
IF #tempError THEN
// 记录错误
#errorStatus[#writeSlaveID] := TRUE;
#errorCount[#writeSlaveID] := #errorCount[#writeSlaveID] + 1;
ELSE
// 清除错误状态(可选)
#errorStatus[#writeSlaveID] := FALSE;
END_IF;
#mode := 0; // 返回读模式
END_IF;
// 正常轮询模式
ELSE
// 检查从站错误状态
IF #errorStatus[#currentSlave] THEN
// 跳过错误从站,直接递增计数器
#currentSlave := #currentSlave MOD 20 + 1;
#pollCounter := #pollCounter + 1;
RETURN;
END_IF;
// 执行读操作 (功能码3 - 读保持寄存器)
#mbMaster(
REQ := TRUE,
MB_ADDR := #currentSlave,
MODE := 0, // 读模式
DATA_ADDR := 40001, // 示例起始地址
DATA_LEN := 10, // 读取10个寄存器
DATA_PTR := #datebuffer, // 指向数据缓冲区
DONE => #tempDone,
ERROR => #tempError);
// 处理读结果
IF #tempDone OR #tempError THEN
IF #tempError THEN
// 记录错误
#errorStatus[#currentSlave] := TRUE;
#errorCount[#currentSlave] := #errorCount[#currentSlave] + 1;
END_IF;
// 移动到下一个从站
#currentSlave := #currentSlave MOD 20 + 1;
#pollCounter := #pollCounter + 1;
END_IF;
END_IF;