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.

DeviceNo
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- Kommunikation
ELA_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);

ConfigCANSettings()
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
);

Erläuterung der Zeitvariablen von ConfigTime()
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;

Erläuterung der Variable _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

Telegramm CAN 2.0A besitzt im schlechtesten Fall eine Länge von 130BIT
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.