Inhalt eines Strings als Variable aufgreifen

2010-07-19
2010-08-27
  • KBW-Sebastian - 2010-07-19

    Hallo,

    ich habe die Inputs meiner einzelnen Module des Wago 750-841 wie folgt deklariert:

    Slot1DI1 AT %IX.01
    Slot1DI2 AT %IX.02
    Slot2DI1 AT %IX.03
    Slot2DI2 AT %IX.04

    usw.

    Nun habe ich eine Variable des Typs String in der z.B. Slot2DI1 steht und möchte den Boolschen Wert hinter Slot2DI1 einer anderen variablen zuweisen.

    FOR slot:=1 TO 32 BY 1 DO
    StringSlot:=INT_TO_STRING(slot);
       FOR i:=1 TO 4 BY 1 DO
          Stringi:=INT_TO_STRING(i);
          STRING1:=CONCAT('Slot',StringSlot);
          STRING2:=CONCAT(STRING1,'DI');
          STRING3:=CONCAT(STRING2,Stringi);
          Digital_Input[i]:=STRING3;  <-- hier sollte Digital_Input[i] jetzt z.B. Slot2DI1 zugewiesen bekommen. Aber nicht als String, sondern den tatsächlichen Wert hinter der Speicheradresse von Slot2DI1. Sprich TRUE oder FALSE.
    
     
  • Anonymous - 2010-07-19

    Originally created by: jl

    Hallo KBW_Sebastian,

    Das kann nicht funktionieren, da die Variable STRING3 als String deklariert ist und in der z.B. der String 'Slot2DI1' steht, nichts zu tun hat mit der Variable Slot2DI1 die als BOOL deklariert ist.

    mfg jl

     
  • Anonymous - 2010-07-19

    Originally created by: ebt'ler

    Ja, genau. Das Programm erkennt nicht das der String eine "Variable auf eine Bitadresse" ist.
    Aber was möchtest du den umsetzen?
    Sollen die 32x4 aufeinanderfolgenden Eingänge nacheinander in ein Array gelegt werden? Das würde auch mit Pointern funktionieren.

    Andernfals gibt es noch anbieterabhänige Lösungen, z.B. bei Backhoff:
    http://infosys.beckhoff.com/index.php?c ... m&id=12034

    Welche Hardware nutzt du?

     
  • KBW-Sebastian - 2010-07-19

    Hi,

    ich habe einen 750-841 und 34x 750-432.

    An die 432 sind jeweils zwei Geräte angeschlossen die einen A oder B Alarm senden wenn der jeweilige Pin auf high springt.

    Gerät 1 -> Slot 1, Pin 1 (A Alarm), Pin 2 (B Alarm)
    Gerät 2 -> Slot 1, Pin 3 (A Alarm), Pin 4 (B Alarm)
    Gerät 3 -> Slot 2, Pin 1 (A Alarm), Pin 2 (A Alarm)
    Gerät 4 -> Slot 2, Pin 3 (A Alarm), Pin 4 (B Alarm)
    ...
    Gerät 68 -> Slot 34, Pin 3 (A Alarm), Pin 4 (B Alarm)

    Die Abfrage für die Alarme ist immer die selbe. Daher wollte ich eine allgemeine Abfrage für ein Gerät generieren und eine For-Schleife bauen. In der For-schleife wollte ich nur den Wert der Variablen ändern die überprüft ob ein highpegel anliegt. Also der variablen einen anderen digitalen Eingang zuweisen.

    FOR slot:=1 TO 34 BY 1 DO
    sz:=INT_TO_STRING(slot);
       FOR i:=1 TO 4 BY 1 DO
          si:=INT_TO_STRING(i);
          STRING1:=CONCAT('Slot',sz);
          STRING2:=CONCAT(STRING1,'DI');
          STRING3:= CONCAT(STRING2,si);
    Digital_Input:=STRING_TO_BOOL (STRING3);
    

    da sollte dann für jeden durchlauf Slot1DI1, Slot1DI3, Slot2DI1, etc drin stehen.
    So hatte ich die Eingänge bei der Steuerungskonfiguration benannt.

    Leider ist es wohl nun nicht möglich den Inhalt eines Strings direkt als Variable des Typs BOOL zu nehmen. Wie könnte ich die Sache anders lösen?

     
  • Anonymous - 2010-07-19

    Originally created by: ebt'ler

    Hier mal ein möglicher Ansatz (ohne Garantie):

    TYPE Geraet :
    STRUCT
       a_alarm : BOOL;
       b_alarm : BOOL;
    END_STRUCT
    END_TYPE
    
    PROGRAM PLC_PRG
    VAR
       pt : POINTER TO WORD;
       start_adresse: WORD;
       i: INT;
       geraete : ARRAY [1..68] OF geraet;
    END_VAR
    
    start_adresse := BITADR(%IX0.0);
    FOR i := 1 TO 68 DO
    pt := ADR(%IW0) + start_adresse / 8 ;
    geraete[i].a_alarm := WORD_TO_BOOL (1 AND SHR (pt^ , start_adresse MOD 8));
    geraete[i].b_alarm := WORD_TO_BOOL (1 AND SHR (pt^ , start_adresse  MOD 8 +1));
    start_adresse := start_adresse + 2 ;
    END_FOR
    
     
  • KBW-Sebastian - 2010-07-20

    Hi,

    danke für die Mühe. Es funktioniert leider nicht. Er steuert die einzelnen Eingangsbits leider nicht an und bei i=5 stürzt der 750-841 ab und alle Lampen blinken rot

    Hätte mir die Sache echt einfacher vorgestellt.

     
  • Anonymous - 2010-07-20

    Originally created by: ebt'ler

    Hm... ich habs nur mal durch die Simulation laufen lassen.
    Sind bei dir die Eingänge fortlaufen, ohne freie Adressen.
    Also:
    %IX0.0
    %IX0.1
    %IX0.2
    %IX0.3
    ...
    %IX0.14
    %IX0.15
    %IX1.0
    %IX1.2
    ...
    Davon bin ich jedenfals erstmal ausgegangen...
    Mal sehen, was mir noch so einfällt.

    EDIT:

    So, jetzt hab ich das mal durch eine 750-841 laufen lassen. Und die kommt im gegensatz zur Simulation nicht damit klar, dass die interne Adresse die durch die Eingangswörter belegt wird im Pointer (to Word) auch mal ungrade wird. Üblicherweise sind die Wordadressen immer byteweise nummeriert, also werden sie pro aufsteigenden Word um 2 weiter gezählt.
    Nun habe ich es mal auf Byte umgestellt. Dadurch geht der PFC nicht mehr in Störung. Die Startadresse sollte deshalb aber eine grade Bitnummer sein (0.0;0.2;0.4; usw.) da es sonst durch die SHR-Funktion (bei start_adresse mod 8 + 1) dazu kommen kann, dass das 8. Bit wegfällt.

    Aber was mir auch aufgefallen ist, damit die Eingänge erfasst werden musste ich sie erstmal im Programm verwenden. Selbst wenn sie dort ohne Funktion sind. Warum das so ist weiß ich im moment nicht. Werde mich da aber mal informieren.

    PROGRAM PLC_PRG
    VAR
       pt : POINTER TO BYTE;
       start_adresse: WORD;
       i: INT;
       geraete : ARRAY [1..68] OF geraet;
    END_VAR
    
    start_adresse := BITADR(%IX0.0);
    %IW0;
    %IW1;
    %IW2;
    %IW3;
    %IW4;
    %IW5;
    %IW6;
    %IW7;
    %IW8;
    FOR i := 1 TO 68 DO
    pt := ADR(%IW0) + start_adresse / 8 ;
    geraete[i].a_alarm := BYTE_TO_BOOL (1 AND SHR (pt^ , start_adresse MOD 8));
    geraete[i].b_alarm := BYTE_TO_BOOL (1 AND SHR (pt^ , (start_adresse  MOD 8) +1));
    start_adresse := start_adresse + 2 ;
    END_FOR
    

    Das habe ich diesmal auf den PFC bis zur Adresse 6.9 getestet. Meht Eingänge hab ich momentan nicht zur Verfügung.
    Hoffe es erfüllt deinen Zweck diesmal.

     
  • Erik Böhm - 2010-07-20

    Mahlzeit

    Zitat:
    Aber was mir auch aufgefallen ist, damit die Eingänge erfasst werden musste ich sie erstmal im Programm verwenden. Selbst wenn sie dort ohne Funktion sind. Warum das so ist weiß ich im moment nicht. Werde mich da aber mal informieren.

    Schau mal in den Zielsystemeinstellungen -> Allgemein.
    Da gibts evtl. "Nicht verwendete I/Os aktualisieren".
    Wenn diese Option nicht aktiv ist (Default), dann werden eben nicht verwendete IO's auch nicht aktualisiert.

    Gruß
    Erik

     
  • Erik Böhm - 2010-07-20

    Nochmal Hallo

    Warum eigentlich kompliziert wenns auch einfach geht ?
    Leg doch auf die Adressen gleich ein BOOLsche Variable.

    ( Digitale Eingänge Knoten 1 )
    xSlot1DI1 AT %IX0.0 : BOOL;
    xSlot1DI2 AT %IX0.1 : BOOL;

    Oder was die benutzung einer Schleife enorm vewreinfachen würde, ein mehrdimensionales ARRAY benutzen.

    Also zusätzlich noch weitere Variablen wie folgt definieren:

    xDigIn: ARRAY[1..34,1..2] of BOOL;

    Diese dann mit dem entsprechenden Eingang verknüpfen:

    xDigIn[1,1] := xSlot1DI1;
    xDigIn[1,2] := xSlot1DI2;
    xDigIn[2,1] := xSlot2DI1;
    usw...

    Dann gehts auch mit der Schleife...

    Gruss
    Erik

     
  • Anonymous - 2010-07-20

    Originally created by: ebt'ler

    Erik Böhm hat geschrieben:
    Schau mal in den Zielsystemeinstellungen -> Allgemein.
    Da gibts evtl. "Nicht verwendete I/Os aktualisieren".
    Wenn diese Option nicht aktiv ist (Default), dann werden eben nicht verwendete IO's auch nicht aktualisiert.

    Danke für die Info, aber die Einstellmöglichkeit habe ich nicht bei Zielsystemeinstellungen. Eventuell läst es sich aber noch woanderst finden.

    Erik Böhm hat geschrieben:
    Nochmal Hallo
    Warum eigentlich kompliziert wenns auch einfach geht ?
    Leg doch auf die Adressen gleich ein BOOLsche Variable.
    ( Digitale Eingänge Knoten 1 )
    xSlot1DI1 AT %IX0.0 : BOOL;
    xSlot1DI2 AT %IX0.1 : BOOL;
    Oder was die benutzung einer Schleife enorm vewreinfachen würde, ein mehrdimensionales ARRAY benutzen.
    Also zusätzlich noch weitere Variablen wie folgt definieren:
    xDigIn: ARRAY[1..34,1..2] of BOOL;
    Diese dann mit dem entsprechenden Eingang verknüpfen:
    xDigIn[1,1] := xSlot1DI1;
    xDigIn[1,2] := xSlot1DI2;
    xDigIn[2,1] := xSlot2DI1;
    usw...
    Dann gehts auch mit der Schleife...
    Gruss
    Erik

    Mit meinen Lösungsweg könnte man sich aber den Schreibaufwand für die 136 Eingänge ersparen.

     
  • Erik Böhm - 2010-07-20

    Moin

    Zu 1.
    Wenn ich einen 750-841 als Zielsystem angebe, habe ich diese Option.
    Unter Allgemein -> links unten.
    Solltest du diese Option nicht haben, dann ist sie deaktiviert.
    Sprich -> IO nicht verwendet -> Nicht aktualisiert.

    Zu 2.

    Zitat:
    Mit meinen Lösungsweg könnte man sich aber den Schreibaufwand für die 136 Eingänge ersparen.

    Dafür funktioniert meine

    Gruß
    Erik

     
  • Anonymous - 2010-07-20

    Originally created by: ebt'ler

    Ich bins schon wieder^^

    Zu 1.:

    Bei mir gibt es diese Einstellung wirklich nicht, vielleicht habe ich noch alte GSD-Dateien?
    (siehe Anhang)

    Zu 2.:

    Wer kann den ahnen dass die Hardware so rumzickt. schmoll

    IMG: Zwischenablage

     
  • Erik Böhm - 2010-07-21

    Moin

    Zu 1.
    Das ist keine GSD Datei, sondern die Targetdatei (0750-0841.trg).
    Evtl. bei Wago ein neues TargetSupportPackage (TSP) anfordern.

    Zu 2.
    das liegt nicht an der Hardware, sondern an CoDeSys.
    Ist aber auch Absicht, damit die Auslastung des Monitorings so gering wie möglich bleibt.

    Gruß
    Erik

     
  • KBW-Sebastian - 2010-07-21

    Hi,

    ich wollte euch beiden nur kurz meinen Dank aussprechen. Das wird mir sehr weiter helfen.

     
  • Anonymous - 2010-07-21

    Originally created by: ebt'ler

    Ach, kein Problem. Wenn du jetzt deine Aufgabe damit erledigen kannst is doch gut.
    Ich hab ja dabei auch wieder was gelernt.
    Aber die GSD-Datein verwechsele ich meist mit den Target-Files.

     
  • KBW-Sebastian - 2010-07-21

    eine kleine Frage habe ich noch:

    Initialiesierung der I/Os. %IW = 1 byte -> 8 Ports ansprechbar -> 256 Module * 4 Ports = 1024 Ports / 8 = %IW0 bis %IW127 nötig.

    Stimmt das so?

     
  • Erik Böhm - 2010-07-21

    Ich versuche mal das zu verstehen...

    Initialisierung der I/Os.

    %IW = 1 byte -> 8 Ports ansprechbar
    %IW zeigt auf ein WORT, also 16 Bit

    -> 256 Module * 4 Ports = 1024 Ports / 8 = %IW0 bis %IW127 nötig.

    1024 IO/s sind also
    64 Worte -> %IW0 bis %IW63
    oder
    128 Byte -> %IB0 bis %IB127

    Gruss
    Erik

     
  • Anonymous - 2010-07-21

    Originally created by: ebt'ler

    Man könnte die Eingänge auch doppelwordweise aufrufen:
    %ID0 entspricht 32bit bzw. Bool-Eingänge.

    Aber wie schon von Erik Böhm erwähnt ist es für die Aktualisierung der Daten nicht erforderlich die Eingänge aufzurufen, wenn man die richtigen Einstellungen getroffen hat.

    Erik Böhm hat geschrieben:
    Mahlzeit
    Schau mal in den Zielsystemeinstellungen -> Allgemein.
    Da gibts evtl. "Nicht verwendete I/Os aktualisieren".
    Wenn diese Option nicht aktiv ist (Default), dann werden eben nicht verwendete IO's auch nicht aktualisiert.
    Gruß
    Erik

     
  • KBW-Sebastian - 2010-07-22

    Hi,

    also ich habe eben beim wago support nach der neusten TSP gefragt.
    Sie haben mir 3 Links geschickt.
    1. Link neuestes Codesys mit aktuellen TSP
    2. Firmware update software
    3. aktuelle firmwares

    Die aktuellste Firmware hatte ich schon drauf. Die Installation des neusten Codesys hat mir den Einstellungspunkt auch nicht hinzugefügt.

    Erik könntest du mal einen Screenshot von dir posten? Den würde ich dann an wago schicken mit einem wie es bei mir aussieht (so wie bei ebt'ler) mit der Frage wieso ich das nicht habe

     
  • Anonymous - 2010-07-22

    Originally created by: ebt'ler

    Also mir wollte Wago keine neuen Target-Files schicken, wenn ich keinen Kaufnachweis für die alten vorlegen kann.
    Und die alten Quitungen sind natürlich iwo verschollen.
    Es wäre aber gut zu wissen ob es diese Funktion nun eigentlich gibt, oder nicht...

     
  • micha1983 - 2010-08-27

    Hallo,

    ja wäre nett, wenn Erik Böhm das ganze mal erklären könnte wie er an diese Funktion gekommen ist!

    Danke

    Gruß Michael

     
  • Erik Böhm - 2010-08-27

    Moin

    1. Anbei der gewünschte Screenshot der Zielsystemeinstellungen.

    2. und die trg Datei. Die ist bereits von 2005. Ich übernehme auch keine Verantwortung für irgendwas...

    Gruß
    Erik

    IMG: 750

    0750 0841.zip [5.31 KiB]

     
  • micha1983 - 2010-08-27

    Vielen Dank für die schnelle Antwort.

    Wei installiere ich ein trg File?

    Wenn ich es über Install Target installiere und den Pfad der Wago Targets angebe fragt er mich ob er das vorhandene File überschreiben soll.
    Klingt man da auf Ja, kann in den vorhandenen Projekten das notwendige Targetfile nicht mehr verwendet werden. Und das Neue File ist auch nicht sichtbar.

    Danke

    Gruß Michael

     
  • Erik Böhm - 2010-08-27

    Was soll ich jetzt da sagen ?
    Ich machs auch nicht anders. Sieht bei mit so aus.

    IMG: InstallTarget750

     

Log in to post a comment.