// 主程序
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;
// 初始化錯(cuò)誤狀態(tài)
FOR #i := 1 TO 20 DO
#errorStatus[#i] := FALSE;
#errorCount[#i] := 0;
END_FOR;
END_IF;
// 處理寫請(qǐng)求 (高優(yōu)先級(jí))
IF #writeRequest THEN
#mode := 1; // 進(jìn)入寫模式
#currentSlave := #writeSlaveID;
// 執(zhí)行寫操作 (功能碼6 - 寫單個(gè)寄存器)
#mbMaster(
REQ := TRUE,
MB_ADDR := #writeSlaveID,
MODE := 1, // 寫模式
DATA_ADDR := #writeAddress,
DATA_LEN := 1, // 寫入1個(gè)寄存器
DATA_PTR := (#writeValue),
DONE => #tempDone,
ERROR => #tempError);
// 處理寫結(jié)果
IF #tempDone OR #tempError THEN
#writeRequest := FALSE;
IF #tempError THEN
// 記錄錯(cuò)誤
#errorStatus[#writeSlaveID] := TRUE;
#errorCount[#writeSlaveID] := #errorCount[#writeSlaveID] + 1;
ELSE
// 清除錯(cuò)誤狀態(tài)(可選)
#errorStatus[#writeSlaveID] := FALSE;
END_IF;
#mode := 0; // 返回讀模式
END_IF;
// 正常輪詢模式
ELSE
// 檢查從站錯(cuò)誤狀態(tài)
IF #errorStatus[#currentSlave] THEN
// 跳過錯(cuò)誤從站,直接遞增計(jì)數(shù)器
#currentSlave := #currentSlave MOD 20 + 1;
#pollCounter := #pollCounter + 1;
RETURN;
END_IF;
// 執(zhí)行讀操作 (功能碼3 - 讀保持寄存器)
#mbMaster(
REQ := TRUE,
MB_ADDR := #currentSlave,
MODE := 0, // 讀模式
DATA_ADDR := 40001, // 示例起始地址
DATA_LEN := 10, // 讀取10個(gè)寄存器
DATA_PTR := #datebuffer, // 指向數(shù)據(jù)緩沖區(qū)
DONE => #tempDone,
ERROR => #tempError);
// 處理讀結(jié)果
IF #tempDone OR #tempError THEN
IF #tempError THEN
// 記錄錯(cuò)誤
#errorStatus[#currentSlave] := TRUE;
#errorCount[#currentSlave] := #errorCount[#currentSlave] + 1;
END_IF;
// 移動(dòng)到下一個(gè)從站
#currentSlave := #currentSlave MOD 20 + 1;
#pollCounter := #pollCounter + 1;
END_IF;
END_IF;