.. first line of object.rst template .. first line of pou-object.rst template .. first line of prg-object.rst template .. <% set key = ".fld-Projektinformationen.ProjectInfo" %> .. _`.fld-Projektinformationen.ProjectInfo`: .. <% merge "object.Defines" %> .. <% endmerge %> .. _`ProjectInfo`: ProjectInfo (PRG) ----------------- PROGRAM ProjectInfo .. <% merge "object.Doc" %> | 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. | .. table:: DeviceNo +--------------+-------------------------------------------------+ | 0 | Kommunikation ist ausgeschalten | +--------------+-------------------------------------------------+ | 1..255 | Kommunikation ist eingeschalten (MODBUS) | | 1..63 | 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);`` | .. table:: ConfigCANSettings() +----------------------+------------------------------------------------------------------------+---------------+ | Variable | Bedeutung: | Defaultwert | +======================+========================================================================+===============+ | CANNo | Wahl des CAN- Controllers 0/1 | 0 | +----------------------+------------------------------------------------------------------------+---------------+ | CANBaud | Setzten der Baudrate | 125 kb | | PollVariableMin | wird erst nach Ablauf dieser Zeit gesandt | | +----------------------+------------------------------------------------------------------------+---------------+ | | 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`` | ``);`` | .. table:: Erläuterung der Zeitvariablen von ConfigTime() +----------------------+------------------------------------------------------------------------+---------------+ | Variable | Bedeutung: | Defaultwert | +======================+========================================================================+===============+ | PollVariableMax | Zeit nach der ein Werte ohne Werteänderung zyklisch gesandt wird. | T#10S | | | Bei Variablenwertänderung innerhalb < PollVariableMax und | | | | > PollVariableMin wird der Wert unverzüglich gesandt | | +----------------------+------------------------------------------------------------------------+---------------+ | PollVariableMin | Sperrzeit für Werteänderungen. Ein Telegramm wegen Variablenänderung | T#50MS | | | wird erst nach Ablauf dieser Zeit gesandt | | +----------------------+------------------------------------------------------------------------+---------------+ | TimeOutDetectDevices | Zeit nachdem ein detektierter Kommunikationspartner nach ausbleiben | t#30s | | | von Telegrammen als "verloren" gilt. (Prüfung alle 3 Sekunden) | | +----------------------+------------------------------------------------------------------------+---------------+ | | 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;`` | .. table:: 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 | .. table:: 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. | | | .. <% endmerge %> .. <% merge "object.iotbl" %> .. <% endmerge %> .. last line of prg-object.rst template .. last line of pou-object.rst template .. last line of object.rst template