ProjectInfo (PRG)¶
PROGRAM ProjectInfo
Die Projektinfo ist eine Ansammlung zur Anwendung der Klasse im ProgrammCode.
Note
Die Beschreibung ist Beispielhaft und an das Projekt Modbus angelehnt.
***********************************************************************************************************************************************************
- Einbinden des Bibliothek ELA-COMM -> Typische vorgehensweise:
1.) Einbinden der Bibliothek und Instanzierung des FB’s
VAR:
ELA_COMM : ELA_COMM.Modbus_Fb;
2.) Device Nummer
Code:
SetDeviceNo(DeviceNo);
MODBUS:
Setzt die Devicenummer unter das Gerät erreichbar ist.
Da der Server, im Gegensatz zum Slave, verbindungsorientiert ist
kann die Nummer ignoriert werden. D.h. der Server antwortet unabhängig seiner eingestellen Devicenummer
auf jede Anfrage die der per TCP-IP erhält.
CAN-Layer2:
Mit dieser Devicenummer werden Telegramme versandt, welche durch alle Teilnehmer empfangen und ausgewertet werden können.
Devicenummer = 0 deaktiviert die Funktionalität und schält die Kommunikation ab.
0 | Kommunikation ist ausgeschalten |
1..255 1..63 | Kommunikation ist eingeschalten (MODBUS) Kommunikation ist eingeschalten (CAN-Layer2) |
3.) Aufruf der Methode
ELA_COMM();
für Modbus- KommunikationELA_COMM.CAN();
für CAN-Layer2- Kommunikation***********************************************************************************************************************************************************
- MODBUS- spezifische Befehle
3.) Variablenversorgung
Für die Kommunikation müssen die Daten bereitgestellt und angegeben werden.
3.) Eigene IP-Adresse
Bei Geräten mit mehreren LAN- Adapter: Angabe der IP-Adresse des LAN-Adapters der verwendet werden soll:
VAR:
DeviceIP : STRING(19):= '192.168.5.58';
Code:
SetDeviceIP(DeviceIP);
bzw. die Zeile komplett ausgeschrieben:
MTN_COMM.Server[0].SetDeviceIP(DeviceIP);
Wird die Methode nicht verwendet, oder einmalig die Adresse ‘0.0.0.0’ gesetzt, ermittelt der Baustein die IP-Adresse
des ersten LAN-Adapters und arbeitet mit dieser Adresse.
4.) Eigener Port
MODBUS:
VAR:
PortNo : WORD := 502;
Code:
SetPortNo(PortNo);
Wird die Methode nicht verwendet, so gilt als Default Port 502
***********************************************************************************************************************************************************
- CAN-Layer2- spezifische Befehle
1.) Konfiguration von CAN-Controller und dessen Baudrate.
RTH_COMM.CAN.CANMASTER[0].ConfigCANSettings(CANNo:=0 ,CANBaud :=125);
Variable | Bedeutung: | Defaultwert |
---|---|---|
CANNo | Wahl des CAN- Controllers 0/1 | 0 |
CANBaud PollVariableMin | Setzten der Baudrate wird erst nach Ablauf dieser Zeit gesandt | 125 kb |
Wird diese Methode nicht ausgeführt, so gelten die Default-Werte.
2.) Anlegen von Datenarray’s
VAR
\\ WERTE:
Ext_BOOL : ARRAY [0..EXT_ARRAYLENGTH-1] OF BOOL;
Ext_BYTE : ARRAY [0..EXT_ARRAYLENGTH-1] OF BYTE;
Ext_INT : ARRAY [0..EXT_ARRAYLENGTH-1] OF INT;
Ext_DINT : ARRAY [0..EXT_ARRAYLENGTH-1] OF DINT;
Ext_REAL : ARRAY [0..EXT_ARRAYLENGTH-1] OF REAL;
\\ FREIGABEN:
\\ Erstes BIT = Werte werden über CANbus bereitgestellt[SENDEN]
\\ Zweites Bit = Werte werden über Canbus aktualisiert [EMPFANG]
Ext_BOOL_ENABLE : ARRAY [0..EXT_ARRAYLENGTH-1] OF BYTE;
Ext_BYTE_ENABLE : ARRAY [0..EXT_ARRAYLENGTH-1] OF BYTE;
Ext_INT_ENABLE : ARRAY [0..EXT_ARRAYLENGTH-1] OF BYTE;
Ext_DINT_ENABLE : ARRAY [0..EXT_ARRAYLENGTH-1] OF BYTE;
Ext_REAL_ENABLE : ARRAY [0..EXT_ARRAYLENGTH-1] OF BYTE;
\\ Temportäre WERTE, werden für Vergleich benötigt
Ext_BOOL_tmp : ARRAY [0..EXT_ARRAYLENGTH-1] OF BOOL;
Ext_BYTE_tmp : ARRAY [0..EXT_ARRAYLENGTH-1] OF BYTE;
Ext_INT_tmp : ARRAY [0..EXT_ARRAYLENGTH-1] OF INT;
Ext_DINT_tmp : ARRAY [0..EXT_ARRAYLENGTH-1] OF DINT;
Ext_REAL_tmp : ARRAY [0..EXT_ARRAYLENGTH-1] OF REAL;
END_VAR
VAR CONSTANT
EXT_ARRAYLENGTH : WORD := 1023;
END_VAR
3.) Übergabe der Datenarray’s
ELA_COMM.CAN.CANMASTER[0].ConfigCANData(
pzData_BOOL := ADR(Ext_BOOL),
pzData_BOOL_ENABLE := ADR(Ext_BOOL_ENABLE),
pzData_BOOL_tmp := ADR(Ext_BOOL_tmp),
pzData_BYTE := ADR(Ext_BYTE),
pzData_BYTE_ENABLE := ADR(Ext_BYTE_ENABLE),
pzData_BYTE_tmp := ADR(Ext_BYTE_tmp),
pzData_INT := ADR(Ext_INT),
pzData_INT_ENABLE := ADR(Ext_INT_ENABLE),
pzData_INT_tmp := ADR(Ext_INT_tmp),
pzData_DINT := ADR(Ext_DINT),
pzData_DINT_ENABLE := ADR(Ext_DINT_ENABLE),
pzData_DINT_tmp := ADR(Ext_DINT_tmp),
pzData_REAL := ADR(Ext_REAL),
pzData_REAL_ENABLE := ADR(Ext_REAL_ENABLE),
pzData_REAL_TMP := ADR(Ext_REAL_Tmp),
DataArrayLength := EXT_ARRAYLENGTH-1
);
4.) Übergabe von Zeitvariablen in der Methode ConfigTime() (Optional)
ELA_COMM.CAN.CANMASTER[0].ConfigTime(
PollVariableMax := T#10S,
PollVariableMin := T#50MS,
TimeOutDetectDevices := t#30s
);
Variable | Bedeutung: | Defaultwert |
---|---|---|
PollVariableMax | Zeit nach der ein Werte ohne Werteänderung zyklisch gesandt wird. Bei Variablenwertänderung innerhalb < PollVariableMax und > PollVariableMin wird der Wert unverzüglich gesandt | T#10S |
PollVariableMin | Sperrzeit für Werteänderungen. Ein Telegramm wegen Variablenänderung wird erst nach Ablauf dieser Zeit gesandt | T#50MS |
TimeOutDetectDevices | Zeit nachdem ein detektierter Kommunikationspartner nach ausbleiben von Telegrammen als “verloren” gilt. (Prüfung alle 3 Sekunden) | t#30s |
Wird diese Methode nicht aufgerufen, gelten die Defaultwerte.
***********************************************************************************************************************************************************
- Weitere, lesende Zugriffsmöglichkeiten auf Informationen von CAN-Layer2
1.) Ermitteln des Bausteinstatus.
ELA_COMM.CAN.CANMASTER[0]._sInfo;
Rückgabewert String(80) | Bedeutung | Defaultwert |
---|---|---|
‘RUN DevID : >0’ | Baustein läuft | |
‘STOP DevID : 0’ | Baustein in STOP Ursache: Durch Benutzer abgeschalten –> DevID =0 | |
‘STOP DevID : >0’ | Baustein in STOP Ursachen: + Keine Elrest-Steuerung + Ein Pointer wurde nicht korrekt übergeben (Pointerüberprüfung) |
2.) Ermitteln der Bausteinversion
ELA_COMM.CAN.CANMASTER[0]._FBVersion;
Als Rückgabewert erhält man die Bausteinversion als String(80). z.B..: ‘CAN-LAYER2 V3.5.8.0 - 20016-08-03’
2.) Ermitteln von Kommunikationspartnern
ELA_COMM.CAN.CANMASTER[0]._CANData.DeviceOK[DeviceNo];
Als Rückgabewert erhält man die Verfügbarkeit des Kommunikationspartner als
BOOL
, gemäß seiner Device- ID.Mit jedem empfangenen Telegramm dieser DeviceID wird DeviceOK[DeviceNo] auf
TRUE
und der Timout für dieses Gerät zurückgesetzt. Bleiben die Telegramme aus, wird nach der Zeit
TimeOutDetectDevices
DeviceOK[DeviceNo] auf
FALSE
gesetzt.***********************************************************************************************************************************************************
- Automatische Lastverteilung
Der Funktionsbaustein verfügt über eine CANBUS- Lastverteilung, die wie folgt aussieht:
1.) Errechnen der Optimalen Last
Annahme:
+ Der CAN-Frame ist mit 130 Bit bereits sehr voll.
+ Der Canbus soll mit einer maximalen Auslastung von 70% betrieben werden.
+ Andere Canbusteilnehmer werden erkannt und berücksichtigt
Bit | Bezeichnung |
---|---|
1 | Start bit |
11 | Identifier bits |
1 | RTR bit |
6 | Control bits |
64 | Data bits |
15 | CRC bits |
19 | (maximum) Stuff bits |
1 | CRC delimiter |
1 | ACK slot |
1 | ACK delimiter |
7 | EOF bits |
3 | ACK slot |
130 | bits |
_OptimalTelegrammPer1s:= ((_CANBaud * 700) /(130*_DevicesDetected )); //Optimale Canbusauslastung je Gerät / Sekunde
Steigt die erkannte CANBus- Auslastung, so wird in...
STUFE 1
Die Telegrammerzeugung so erhöht, daß die 70% erreicht werden.
Sollte Stufe ein nicht zielführend sein, da eben so viele Telegramme gesendet werden gilt.....
STUFE 2
Das Schrittweise erhöhen der minimales Pollzeit bis auf das 3 fache des Ursprungswerts.
Sinkt die Buslast wieder unter 70%, so wird auch die PollzeitMIN wieder bis zum Ursprungswert reduziert.
Note
Stufe 2 ist nur nur Wirksam wenn die Methode``ConfigTime()`` nicht zyklisch aufgerufen wird.