Écrire des données vers un esclave avec offset
Utilisez cette instruction pour écrire les données d’un maître vers un esclave via le port de communication avec le protocole MEWTOCOL ou Modbus RTU, selon les paramètres définis dans les registres système du port utilisé. Le maître et l’esclave doivent être définis avec le même protocole. Le maître et l’esclave doivent avoir des zones de mémoire correspondantes.
Pour les transferts de données à l’aide du protocole Modbus, le compilateur génère des commandes Modbus basées sur les adresses Modbus.Entrée
Indique les ports de communication (selon le type d’API) :
Port COM, par ex. SYS_COM0_PORT
Port Ethernet, par ex. SYS_ETHERNET_USER_CONNECTION_1
MCU/SCU, par ex. 16#xx01 (xx = numéro du connecteur) dans COM01
Numéro de station de l’esclave (MEWTOCOL : 1–99, MODBUS : 1–247)
Défini sur 1, si SYS_ETHERNET_USER_CONNECTION_xx est appliquée à l’entrée Port
Zone de mots ou registre sur le maître pour les données à écrire vers l’esclave.
Nombre de mots (bits) à transférer.
Soit :
Nombre de mots
pour Modbus RTU : 16#001–16#07F
pour MEWTOCOL-COM : 16#001–16#1FD ou 16#001–16#1B (FP0, FP-e)
Ou :
Mot de contrôle pour le transfert de bits : 16#8T0F avec T pour un transfert de bits vers le maître et F pour un transfert de bits vers l’esclave (ne s’applique pas à FP7).
Zone de mémoire sur l’esclave dans laquelle les données sont sauvegardées (destination = SlaveMemoryArea + SlaveMemoryOffset).
Type de zone mémoire |
Variable système |
---|---|
Drapeaux internes |
|
Drapeaux de liaison |
|
Entrées externes |
|
Sorties externes |
|
Drapeaux internes |
|
Valeur de consigne pour temporisateur/compteur |
|
Valeur courante pour temporisateur/compteur |
|
Registres de données |
|
Drapeaux de liaison |
|
Registres de liaison |
|
Registres de fichiers |
|
Registres d’entrée |
|
Registres de sortie |
Offset de la zone mémoire de l’esclave dans laquelle les données sont sauvegardées (destination = SlaveMemoryArea + SlaveMemoryOffset).
Sortie
Pour FP7 uniquement : Vous trouverez une description de tous les codes d’erreur dans le tableau des codes d’erreur de communication Modbus/MEWTOCOL.
Pour les autres automates : défini sur 0
Envoi en cours : Drapeau d’envoi de la communication maître est TRUE
Envoi terminé : Drapeau d’envoi de la communication maître est FALSE
Exécution terminée normalement : FALSE
Exécution terminée anormalement : TRUE
Si la zone spécifiée à l’aide du modificateur d’adresse est en dehors des limites autorisées.
Si le nombre de données envoyées, spécifié par Words_Bits est incorrect.
Si la zone spécifiée à l’aide du modificateur d’adresse est en dehors des limites autorisées.
Si le nombre de données envoyées, spécifié par Words_Bits est incorrect.
Toutes les variables d’entrée et de sortie utilisées pour programmer cette fonction ont été déclarées dans l’en-tête du POU. Le même en-tête de POU est utilisé pour tous les langages de programmation.
VAR
bSetParameters: BOOL:=FALSE;
wWriteToSlaveResult: WORD:=0;
(*result of write to slave instruction*)
iSlaveStationNumber: INT:=0;
(*slave station number*)
arrParameters: ARRAY [0..15] OF DINT;
(*Array of parameters to be send to slave station*)
iSlaveMemoryOffset: INT:=100;
bBool: BOOL:=FALSE;
END_VAR
VAR CONSTANT
iSlaveMemoryArea_Bool: INT:=10000;
(*memory Area in slave station*)
iSlaveMemoryArea_Word: INT:=5;
(*memory Area in slave station*)
END_VAR
VAR
END_VAR
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 9 ;
NETWORK_BODY
B(B_VARIN,,SYS_COM1_PORT,18,2,20,4,);
B(B_VARIN,,iSlaveStationNumber,18,3,20,5,);
B(B_VARIN,,arrParameters,11,4,13,6,);
B(B_CONTACT,,bSetParameters,4,1,6,3,);
B(B_VAROUT,,wWriteToSlaveResult,36,2,38,4,);
B(B_F,Size_Of_Var!,,13,5,20,7,,?D?C);
B(B_F,FP_WRITE_TO_SLAVE_AREA_OFFS!,,20,0,36,9,,?DEN?DnPort?DStationNumber?DSource?DWords_Bits?HSlaveMemoryArea?DSlaveMemoryOffset?AENO?CResult);
B(B_VARIN,,SYS_MEMORY_AREA_DT,18,6,20,8,);
B(B_VARIN,,iSlaveMemoryOffset,18,7,20,9,);
L(13,5,13,6);
L(1,2,4,2);
L(13,5,20,5);
L(6,2,20,2);
L(1,0,1,9);
END_NETWORK_BODY
END_NET_WORK
END_BODY
if (bSetParameters) then
FP_WRITE_TO_SLAVE_AREA_OFFS(Port := SYS_COM1_PORT,
StationNumber := iSlaveStationNumber,
Source := arrParameters[0],
Words_Bits := Size_Of_Var(arrParameters[0]),
SlaveMemoryArea := SYS_MEMORY_AREA_DT,
SlaveMemoryOffset := iSlaveMemoryOffset,
Result => wWriteToSlaveResult);
end_if;