スレーブからのデータ読み出し(オフセット付き)
この命令は、MEWTOCOL-COMまたはModbus RTUプロトコルを使って、通信ポートを介して、スレーブ側にデータを要求するときに使用します。使用するポートのシステムレジスタで設定します。マスターとスレーブに同じプロトコルが設定されていることを確認してください。マスターとスレーブのメモリエリアが一致している必要があります。
Modbusプロトコルを使用したデータ転送では、コンパイラは、Modbus参照番号に基づいてModbusコマンドを生成します。
入力
通信ポートの指定(PLC機種による):
COMポート、例:SYS_COM0_PORT
Ethernetポート 例: SYS_ETHERNET_USER_CONNECTION_1
MCU/SCU、例:16#xx01 (xx =スロット番号) COM01
スレーブの局番 (MEWTOCOL: 1~99、MODBUS:1~255)
SYS_ETHERNET_USER_CONNECTION_xxを入力Portに割り付けるには、1をセットします。
データの要求先であるスレーブの先頭アドレス
データの要求先であるスレーブの先頭アドレスのオフセット
転送されるワード(ビット)数
以下のいずれかを指定:
ワード数
Modbus RTUの場合:16#001–16#07F
MEWTOCOL-COMの場合:16#001–16#1FDまたは16#001–16#1B (FP0、FP-e)
または:
ビット転送用の制御ワード:16#8T0FでTは「to bit」の意でマスター側のビット、Fは「from bit」の意でスレーブのビット番号を示します(FP7には適用されません)。
出力
要求されたデータが書き込まれるマスターユニットのワードエリアまたはレジスタ。
0:正常完了
1: 通信ポートがマスタ通信に使用されている
2: 通信ポートがスレーブ通信で使用されている
3: 同時に実行できるマスタ通信命令数を超えている
4: 送信タイムアウト
5: レスポンス受信タイムアウト
6: 受信データエラー
送信時:マスター通信の送信フラグはTRUEです
送信完了時:マスター通信の送信フラグはFALSEです
正常完了:FALSE
異常完了:TRUE
POUヘッダには、このプログラムで使用するすべての入力変数と出力変数を宣言します。 POUヘッダは全プログラム言語で使用できます。
VAR
bReadResult: BOOL:=FALSE;
wReadFromSlaveResult: WORD:=0;
(*result of write to slave instruction*)
iSlaveStationNumber: INT:=0;
(*slave station number*)
arrResults: ARRAY [0..9] OF REAL:=[10(0.0)];
(*Array of results to be read from slave station*)
iSlaveMemoryOffset: INT:=200;
iSlaveMemorySize: INT:=1;
END_VAR
VAR CONSTANT
iSlaveMemoryArea: INT:=5;
(*memory Area in slave station*)
END_VAR
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 8 ;
NETWORK_BODY
B(B_VARIN,,SYS_COM1_PORT,15,2,17,4,);
B(B_VARIN,,iSlaveStationNumber,15,3,17,5,);
B(B_CONTACT,,bReadResult,4,1,6,3,);
B(B_VAROUT,,wReadFromSlaveResult,34,3,36,5,);
B(B_VAROUT,,arrResults,34,2,36,4,);
B(B_VARIN,,SYS_MEMORY_AREA_DT,15,4,17,6,);
B(B_VARIN,,iSlaveMemoryOffset,15,5,17,7,);
B(B_VARIN,,iSlaveMemorySize,15,6,17,8,);
B(B_F,FP_READ_FROM_SLAVE_AREA_OFFS!,,17,0,34,8,,?DEN?DnPort?DStationNumber?HSlaveMemoryArea?DSlaveMemoryOffset?DWords_Bits?AENO?CDestination?CResult);
L(1,2,4,2);
L(6,2,17,2);
L(1,0,1,8);
END_NETWORK_BODY
END_NET_WORK
END_BODY
if (bReadResult) then
FP_READ_FROM_SLAVE_AREA_OFFS(Port := SYS_COM1_PORT,
StationNumber := iSlaveStationNumber,
SlaveMemoryArea := SYS_MEMORY_AREA_DT,
SlaveMemoryOffset := iSlaveMemoryOffset,
Words_Bits := iSlaveMemorySize,
Destination => arrResults[0],
Result => wReadFromSlaveResult);
end_if;