// 主程序
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;