Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched.
Close
ich habe ein Problem auf der WAGO 750-841 mit der Funktion GET_RUN_VALUE() und GET_STOP_VALUE() aus der System.lib. Die Firmware des PLC ist "02.11.03 (14)".
Das Problem ist das GET_RUN_VALUE() nicht TRUE wird beim ersten Durchlauf. Auf einer 750-842 bekomme ich das selbe Programm zum Laufen.
Ziel ist es beim Start einen TCP Verbindung zu öffnen. Im Anhang habe ich es auf eine einfache Demo reduziert.
Kann einer der Profis einem dummen Hochsprachenprogrammierer helfen?
Muss ich das über Tasks machen? (Das muss ich wohl dringend lernen)
Danke, Gruß
Martin
PROGRAMPLC_PRG(*Hardware:
  750-841PLC
  750-5308DO(A0 .. A7)
  750-4308DI(E0 .. E7)
  750-600  Endklemmen*)VAR
  CycleCount : WORD :=0;END_VARIFGET_RUN_VALUE(TRUE)THEN
  A6 :=TRUE;END_IF;IFGET_STOP_VALUE(TRUE)THEN
  A6 :=FALSE;END_IF;A5 :=TRUE;(*BlinkoutputA7*)CycleCount :=(CycleCount+1)MOD16#0FFF;A7 :=(CycleCountAND16#0200)<>0;END_PROGRAM
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Die System.Lib ist eine 16Bit Library, also nur für den 842er Controller geeignet, nicht für den 841er. Da mußt Du was vergleichbares aus dem Ordner 32 Bit raussuchen.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Zitat:
Auch wenn ich "System.lib 18.10.04 05:23:28" aus ...\CoDeSys V2.3\Targets\WAGO\Libraries\IO_IPC einbinde tut es nicht
Na klar, der 841 ist auch kein Industrie-PC.
Also ich habe im Ordner 32 Bit keine system.lib, standardmäßig ist die da nicht drin. Ich würde mal unter "Resourcen", "Taskkonfiguration" bei den System Ereignissen "Start" und "Stop" aktivieren, da ein Programm definieren, dann kannst Du die Aktionen da ausführen.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Oberchefe hat geschrieben:
Na klar, der 841 ist auch kein Industrie-PC.
Es war zumindest einen Versuch wert
Also ich habe jetzt mit der Taskkonfiguration rumgespielt und bekomme mit dem folgenden Code ein ähnliches Verhalten wie auf der 842:
PROGRAMPLC_PRG
  (*Hardware:
    750-841PLC
    750-5308DO(A0 .. A7)
    750-4308DI(E0 .. E7)
    750-600Endklemmen
  *)
  VAR_INPUT
    RunValue : BOOL :=FALSE; (* TRUE on first cycle *)
    StopValue : BOOL :=FALSE; (* TRUE on last cycle *)
  END_VAR
  VAR
    CycleCount : WORD :=0;
  END_VAR
  IFRunValueTHENA6 :=TRUE; END_IF;
  IFStopValueTHENA6 :=FALSE; END_IF;
  A5 :=TRUE;
  (*BlinkoutputA7*)
  CycleCount :=(CycleCount+1)MOD16#0FFF;
  A7 :=(CycleCountAND16#0200)<>0;END_PROGRAMPROGRAMPLC_START
  PLC_PRG(RunValue :=TRUE , StopValue :=FALSE);END_PROGRAMPROGRAMPLC_STOP
  PLC_PRG(RunValue :=FALSE , StopValue :=TRUE);END_PROGRAMRESOURCE
  TASKPLC_PRG(PRIORITY :=1, INTERVAL :=T#5ms);
    PLC_PRG(RunValue :=FALSE, StopValue :=FALSE);
    {Additional_info : 2,0,0,0,1,4294967295}
  END_TASK
  {event_task : 'start',
         'Called when program starts',
         'PLC_START',
         'FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}
  {event_task_info : 1,1,11987}
  {event_task : 'stop',
         'Called when program stops',
         'PLC_STOP',
         'FUNCTION systemevent: DWORD VAR_INPUT dwEvent: DWORD; dwFilter: DWORD; dwOwner: DWORD; END_VAR '}
  {event_task_info : 1,2,11987}
END_RESOURCE
Ich habe also zwei neuen Programme PLC_START und PLC_STOP eingefügt und diese bei den Systemereignissen Start und Stop eingetragen. Unter der freilaufenden Task PLC_PRG (PRIORITY=1) ist der Aufruf "PLC_PRG(RunValue:=FALSE,StopValue:=FALSE)" eingehängt.
So kann folgt der Ausgang A6 dem Start/Stop aus Codesys und dem Betriebsartenschalter. Auch nach einem Reset geht A6 an. Mal sehen, ob ich damit mein eigentliches Problem lösen kann.
Ich habe auch probiert die Bausteine über den Button "Baustein XXX erzeugen" aus der Taskkonfiguration anzulegen. Aber dann wird eine Funktion erzeugt
Noch zwei Fragen:
Ist die Priority 1 eine gute Wahl?
Warum ist ein direktes Setzen eines Ausganges aus PLC_START wirkungslos, wenn der Ausgang nicht auch im PLC_PRG referenziert wird?
Danke für die Hilfe, Gruß
Martin
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Bei den Prioritäten gilt: je kleiner die Zahl desto wichtiger wird der Task behandelt. Solange in dem Programm nicht mehr drinsteht ist die 1 überhaupt kein Problem. Ist das Programm größer und enthält es gar blockierende Dinge (wie z.B. Ethernet Funktionen), dann wäre eine 1 unter Umständen fatal, Kommunikationsaussetzer zum PC wäre wohl noch einer der harmlosesten Effekte.
Zitat:
Warum ist ein direktes Setzen eines Ausganges aus PLC_START wirkungslos, wenn der Ausgang nicht auch im PLC_PRG referenziert wird?
Wenn man BOOLs in einem Task (Programm) setzen will und im anderen abfragen, nimmt man üblicherweise Global deklarierte Variablen.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
BTW: was ist das eigentliche Problem? Einen BOOL für den ersten Zyklus kann man auch noch einfacher generieren, den für den letzten allerdings nicht.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Oberchefe hat geschrieben:
Bei den Prioritäten ...., dann wäre eine 1 unter Umständen fatal, Kommunikationsaussetzer zum PC wäre wohl noch einer der harmlosesten Effekte.
Ok. Dann hoffe ich mal das der FB TCP_Server aus der WagoLibEthernet_01.ib nicht blockiert. Ebenso serial_interface_01.lib. In der Doku steht nichts dazu . Meine Versuche zeigen aber kein Problem mit blockieren.
Oberchefe hat geschrieben:
Wenn man BOOLs in einem Task (Programm) setzen will und im anderen abfragen, nimmt man üblicherweise Global deklarierte Variablen.
Schon klar. Wenn ich A0 bis A7 in der Steuerungskonfiguration definiert habe als %QX0.0 .. %QX0.7 sind sie wohl global. Das Problem ist, wenn ich in PLC_START noch "A4 := TRUE" ergänze geht der Ausgang nicht an. Ich kann dann in PLC_MAIN ergänzen "IF A4 THEN ;; END_IF;" dann tut er.
Oberchefe hat geschrieben:
BTW: was ist das eigentliche Problem? Einen BOOL für den ersten Zyklus kann man auch noch einfacher generieren, den für den letzten allerdings nicht.
Das STOP ist da eigentliche Problem. Die TCP-Verbindungen sollen sauber beendet werden (FIN).
Danke für die Hilfe. Die Doku ist echt an vielen Stellen nicht hilfreich.
Gruß
Martin
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo,
ich habe ein Problem auf der WAGO 750-841 mit der Funktion GET_RUN_VALUE() und GET_STOP_VALUE() aus der System.lib. Die Firmware des PLC ist "02.11.03 (14)".
Das Problem ist das GET_RUN_VALUE() nicht TRUE wird beim ersten Durchlauf. Auf einer 750-842 bekomme ich das selbe Programm zum Laufen.
Ziel ist es beim Start einen TCP Verbindung zu öffnen. Im Anhang habe ich es auf eine einfache Demo reduziert.
Kann einer der Profis einem dummen Hochsprachenprogrammierer helfen?
Muss ich das über Tasks machen? (Das muss ich wohl dringend lernen)
Danke, Gruß
Martin
Die System.Lib ist eine 16Bit Library, also nur für den 842er Controller geeignet, nicht für den 841er. Da mußt Du was vergleichbares aus dem Ordner 32 Bit raussuchen.
Hi,
danke für den schnellen Hinweis.
Ich habe geschaut:
In dem Projekt für den 841 ist "System.lib 5.10.04 09:43:00" aus ...\CoDeSys V2.3\Targets\WAGO\Libraries\32_Bit eingebunden.
In dem Projekt für den 842 ist "System.lib 6.12.00 08:50:26" aus
...\CoDeSys V2.3\Targets\WAGO\Libraries\16_Bit eingebunden.
Bei meiner Installation gibt es aber nur im 16_Bit Verzeichnis eine passende Hexdatei.
Ist das mein Problem?
<edit></edit>
Auch wenn ich "System.lib 18.10.04 05:23:28" aus ...\CoDeSys V2.3\Targets\WAGO\Libraries\IO_IPC einbinde tut es nicht
Danke für die schnelle Hilfe, Gruß
Martin
Na klar, der 841 ist auch kein Industrie-PC.
Also ich habe im Ordner 32 Bit keine system.lib, standardmäßig ist die da nicht drin. Ich würde mal unter "Resourcen", "Taskkonfiguration" bei den System Ereignissen "Start" und "Stop" aktivieren, da ein Programm definieren, dann kannst Du die Aktionen da ausführen.
Es war zumindest einen Versuch wert
Also ich habe jetzt mit der Taskkonfiguration rumgespielt und bekomme mit dem folgenden Code ein ähnliches Verhalten wie auf der 842:
Ich habe also zwei neuen Programme PLC_START und PLC_STOP eingefügt und diese bei den Systemereignissen Start und Stop eingetragen. Unter der freilaufenden Task PLC_PRG (PRIORITY=1) ist der Aufruf "PLC_PRG(RunValue:=FALSE,StopValue:=FALSE)" eingehängt.
So kann folgt der Ausgang A6 dem Start/Stop aus Codesys und dem Betriebsartenschalter. Auch nach einem Reset geht A6 an. Mal sehen, ob ich damit mein eigentliches Problem lösen kann.
Ich habe auch probiert die Bausteine über den Button "Baustein XXX erzeugen" aus der Taskkonfiguration anzulegen. Aber dann wird eine Funktion erzeugt
Noch zwei Fragen:
Ist die Priority 1 eine gute Wahl?
Warum ist ein direktes Setzen eines Ausganges aus PLC_START wirkungslos, wenn der Ausgang nicht auch im PLC_PRG referenziert wird?
Danke für die Hilfe, Gruß
Martin
Bei den Prioritäten gilt: je kleiner die Zahl desto wichtiger wird der Task behandelt. Solange in dem Programm nicht mehr drinsteht ist die 1 überhaupt kein Problem. Ist das Programm größer und enthält es gar blockierende Dinge (wie z.B. Ethernet Funktionen), dann wäre eine 1 unter Umständen fatal, Kommunikationsaussetzer zum PC wäre wohl noch einer der harmlosesten Effekte.
Wenn man BOOLs in einem Task (Programm) setzen will und im anderen abfragen, nimmt man üblicherweise Global deklarierte Variablen.
BTW: was ist das eigentliche Problem? Einen BOOL für den ersten Zyklus kann man auch noch einfacher generieren, den für den letzten allerdings nicht.
Ok. Dann hoffe ich mal das der FB TCP_Server aus der WagoLibEthernet_01.ib nicht blockiert. Ebenso serial_interface_01.lib. In der Doku steht nichts dazu . Meine Versuche zeigen aber kein Problem mit blockieren.
Schon klar. Wenn ich A0 bis A7 in der Steuerungskonfiguration definiert habe als %QX0.0 .. %QX0.7 sind sie wohl global. Das Problem ist, wenn ich in PLC_START noch "A4 := TRUE" ergänze geht der Ausgang nicht an. Ich kann dann in PLC_MAIN ergänzen "IF A4 THEN ;; END_IF;" dann tut er.
Das STOP ist da eigentliche Problem. Die TCP-Verbindungen sollen sauber beendet werden (FIN).
Danke für die Hilfe. Die Doku ist echt an vielen Stellen nicht hilfreich.
Gruß
Martin