スレーブからのデータ読み出し
この命令は、MEWTOCOL-COMまたはModbus RTUプロトコルを使って、通信ポートを介して、スレーブ側にデータを要求するときに使用します。使用するポートのシステムレジスタで設定します。マスターとスレーブに同じプロトコルが設定されていることを確認してください。マスターとスレーブのメモリエリアが一致している必要があります。マスターのユーザーエリアでスレーブデータが利用できない場合は、FP_READ_FROM_SLAVE_AREA_OFFSまたはFP_MODBUS_MASTERを使用します。
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をセットします。
データの要求先であるスレーブ側のソースアドレス。
出力
要求されたデータが書き込まれるマスターユニットのワードエリアまたはレジスタ。
0:正常完了
1: 通信ポートがマスタ通信に使用されている
2: 通信ポートがスレーブ通信で使用されている
3: 同時に実行できるマスタ通信命令数を超えている
4: 送信タイムアウト
5: レスポンス受信タイムアウト
6: 受信データエラー
送信時:マスター通信の送信フラグはTRUEです
送信完了時:マスター通信の送信フラグはFALSEです
正常完了:FALSE
異常完了:TRUE
選択されたCOMポートが、装着されていない通信カセットを必要としているとき
グローバル変数リストでは、プロジェクト内のすべてのPOUからアクセスできる変数を宣言します。
POUヘッダには、このプログラムで使用するすべての入力変数と出力変数を宣言します。 POUヘッダは全プログラム言語で使用できます。
VAR_EXTERNAL
g_Peripherie_SlaveResult_Address: ARRAY[0..9] OF REAL:=[10(0)];
END_VAR
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*)
iSlaveMemoryArea: INT:=5;
(*memory Area in slave station*)
iSlaveMemoryOffset: INT:=100;
iSlaveMemorySize: INT:=1;
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,19,2,21,4,);
B(B_VARIN,,iSlaveStationNumber,19,3,21,5,);
B(B_CONTACT,,bReadResult,8,1,10,3,);
B(B_VAROUT,,wReadFromSlaveResult,38,3,40,5,);
B(B_VAROUT,,arrResults,38,2,40,4,);
B(B_F,FP_READ_FROM_SLAVE!,,21,0,33,6,,?DEN?DnPort?DStationNumber?DSlaveAddress?AENO?CDestination?CResult);
B(B_VARIN,,g_Peripherie_SlaveResult_Address,19,4,21,6,);
L(1,2,8,2);
L(10,2,21,2);
L(33,3,38,3);
L(33,4,38,4);
L(1,0,1,8);
END_NETWORK_BODY
END_NET_WORK
END_BODY
if (bReadResult) then
FP_READ_FROM_SLAVE(Port := SYS_COM1_PORT, StationNumber := iSlaveStationNumber,
SlaveAddress := g_Peripherie_SlaveResult_Address, Destination => arrResults[0],
Result => wReadFromSlaveResult);
end_if;