Scl problem

301204020608

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

habe folgende fehlermeldung

der typ der sicht ist nicht mit dem typ der variablen verträglich.

Code:

In : Int;
zaehler at in : Struct
ziffer_01 : Byte;
ziffer_23 : Byte;

end_struct;

was ist der fehler?
Vielen dank im voraus

mfg manni
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

habe folgende fehlermeldung

der typ der sicht ist nicht mit dem typ der variablen verträglich.

Code:

In : Int;
zaehler at in : Struct
ziffer_01 : Byte;
ziffer_23 : Byte;

end_struct;

was ist der fehler?
Vielen dank im voraus

mfg manni

Vermute, du hast die Variablen im VAR_INPUT-Block stehen. Das scheint nicht zu gehen.
Lege die Variable und die Variable für die Sicht in den Temp-Bereich und übergebe die Input-Variable an die Temp.
 
Zuletzt bearbeitet:
wenn er sie extern angelegt hätte, warum macht er dann datentyp-zuweisungen?? ich glaube er hat sie schllicht nicht richtig definiert

Nein, er hat doch nur das Stück Code ausgeschnitten. Und das scheint aus der Variablendeklaration im VAR_INPUT-Block zu stammen, dann wird nämlich genau der beschriebene Fehler erzeugt. Er muß die Variablen also im Temp-Bereich (Stat-Bereich kann man ja auch mal testen) deklarieren, dann ist die Fehlermeldung weg.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, er hat doch nur das Stück Code ausgeschnitten. Und das scheint aus der Variablendeklaration im VAR_INPUT-Block zu stammen, dann wird nämlich genau der beschriebene Fehler erzeugt. Er muß die Variablen also im Temp-Bereich (Stat-Bereich kann man ja auch mal testen) deklarieren, dann ist die Fehlermeldung weg.


Die Variablen im Temp-Bereich deklariert --> hat nicht funktioniert
 
Hallo ihr,
ich habe da irgendwas mit WORT-Grenze in Erinnerung. Das Problem könnte daraus resultieren, dass die beiden Einzel-Variablen in der AT-Sicht Bytes sind. Mach doch an Stelle desse mal die Sicht auf ein "ARRAY[1..2]of Byte" - nur mal so spaßes halber - ich kann das selber im Augenblick nicht ausprobieren ...

Gruß
Larry
 
Hallo ihr,
ich habe da irgendwas mit WORT-Grenze in Erinnerung. Das Problem könnte daraus resultieren, dass die beiden Einzel-Variablen in der AT-Sicht Bytes sind. Mach doch an Stelle desse mal die Sicht auf ein "ARRAY[1..2]of Byte" - nur mal so spaßes halber - ich kann das selber im Augenblick nicht ausprobieren ...

Gruß
Larry

habe es soeben ausprobiert leider kein erfolg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe ich nun auch ...
Das nachfolgende funktioniert :
Code:
VAR_TEMP
    Eingang: INT;
    aEingang AT Eingang : ARRAY[1..2] OF BYTE ;
    bEingang AT Eingang : STRUCT
        byte_1 : BYTE ;
        byte_2 : BYTE ;
    END_STRUCT ;    
END_VAR
... aber bei mir kann ich auch deine Eingabe machen.
Auch im IN-Bereich.
Vielleicht solltest du deinen weiteren Code noch mal checken.

Gruß
Larry
 
Habe ich nun auch ...
Das nachfolgende funktioniert :
Code:
VAR_TEMP
    Eingang: INT;
    aEingang AT Eingang : ARRAY[1..2] OF BYTE ;
    bEingang AT Eingang : STRUCT
        byte_1 : BYTE ;
        byte_2 : BYTE ;
    END_STRUCT ;    
END_VAR
... aber bei mir kann ich auch deine Eingabe machen.
Auch im IN-Bereich.
Vielleicht solltest du deinen weiteren Code noch mal checken.

Gruß
Larry

Yep, sag ich ja, bei mir ging das auch.
Achtung, es geht keine Sicht auf eine Input-Variable, beide Var müssen in den Temp-Bereich und die Input-Varaible muß dann der Temp-Variable zugewiesen werden.
 
Hat jemand hier mal ein paar Beispiele für SCL, ich rechne viel in SCL. Jetzt will ich ein paar FB Routinen in SCL schreiben. Ich suche speziell DB Aufrufe und Timer Aufrufe.

Danke.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Achtung, es geht keine Sicht auf eine Input-Variable ...

Naja ... ich hatte es bei einem FB ausprobiert - da geht das auch auf IN und OUT ... ich muss allerdings gestehen, dass ich nicht mit einem FC getestet habe ...

Gruß
Larry
 
Naja ... ich hatte es bei einem FB ausprobiert - da geht das auch auf IN und OUT ... ich muss allerdings gestehen, dass ich nicht mit einem FC getestet habe ...

Gruß
Larry

Ah ja, Recht hast du natürlich, ich hab das in einem FC ausprobiert.
Menno, ich finde das reichlich abartig von Siemens, daß FC und FB da immer wieder unterschiedliche Eigenschaften haben.
 
Ich suche speziell DB Aufrufe und Timer Aufrufe.
Dazu einfach mal die Siemens-Hilfe von SCL benutzen. Da steht das Alles und sogar auch sehr gut beschrieben drin.
Ansonsten habe ich persönlich immer ein bißchen Probleme mit "pauschalen" Fragen - also lieber konkret zu etwas fragen ... dann bekommst du auch konkrete Antwort.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
jetzt habe ich eine nicht "pauschale" Frage,

(hab noch nicht in die Hilfe geschaut)

habe einen Wert der nur jede Minute aktualisiert wird, habe auch einen Minutentrigger, möchte jetzt eine Mittelwertbildung machen, über 5 Minuten! In AWL würde ich den Wert immer ein Register weiterschieben im DB und dann den Mittelwert der Register nehmen.

Wie sieht das nun in SCL aus? (speziell mit dem Zugriff auf den DB?)

Servus.
 
Hallo,
wenn du mit einem "externen DB" arbeitest im Grunde genauso, wie in AWL. Damit umgehst du allerdings komplett die hier doch sehr brauchbaren Fähigkeiten von SCL.
Ich würde hierfür einen FB erstellen und den fraglichen Datenbereich als Array im STAT-Bereich desselben anlegen. Nun kannst du die einzelnen Elemente des Array's über die Indexierung in einer Schleife ansprechen bzw. den Index zum Reinschreiben einfach erhöhen.
Schau einfach mal in der SCL-Hilfe unter "FOR .. TO" etc. nach.

Gruß
Larry
 
Ich habe mal was schrieben, wie ich denke, können kommentierungen fehlen,


VAR_INPUT
Min_Trigger: BOOL;
Menge_1: REAL;
END_VAR
VAR_OUTPUT
5min_Mittelwert: REAL;
END_VAR

VAR
I: INT;
Mittelwert: ARRAY[1..5] OF REAL;
END_VAR

IF Min_Trigger THEN
I := I + 1;
Mittelwert := Menge_1;
END_IF;

IF I = 5 THEN
Messwertsumme := 0;
FOR K := 1 TO 5 DO
5min_Mittelwert := Mittelwert / 5;
END_FOR;
I := 0
END_IF;

END_FUNCTION_BLOCK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja ... du mußt den Index natürlich in dein Programm mit integrieren ...
Außerdem solltest du beim Beschreiben des Array's auf jeden Fall verriegeln, dass du nicht über die Grenzen hinaus adressierst ...

Ich habe deine Code mal ein bißchen modifiziert ...
Code:
IF Min_Trigger THEN
   I := I + 1; 
[COLOR=red]   if I <= 5 then [/COLOR]
      Mittelwert[I] := Menge_1; 
[COLOR=red]   end_if ;
[/COLOR]END_IF;

IF I[COLOR=red] >=[/COLOR] 5 THEN
   Messwertsumme := 0;
   FOR K := 1 TO 5 DO
[COLOR=red]      Messwertsumme := Messwertsumme + Mittelwert[I] ;
[/COLOR]   END_FOR; 
[COLOR=red]   5min_Mittelwert := Messwertsumme / 5.0 ;
[/COLOR]   I := 0
END_IF; 

END_FUNCTION_BLOCK
Wenn du die rot markierten Passagen so übernimmst dann sollte es m.E. funktionieren ...

Gruß
Larry
 
Ich habe noch ein paar Fragen,

also das mit dem trigger lasse ich lieber, ich glaube ich bilde mir eine Flanke wenn ich Sekunden vergleiche.

Das K von der FOR Schleife wird nicht verwendet, ist das ok?

Das Ganze brauche ich für 30 Werte, kann man das jetzt noch optimieren oder muss die Logic 30 mal anlegen mit 30 Ein/Ausgängen, Arrays, etc.

Danke, Servus.
 
Ich habe noch ein paar Fragen,

also das mit dem trigger lasse ich lieber, ich glaube ich bilde mir eine Flanke wenn ich Sekunden vergleiche.

Das K von der FOR Schleife wird nicht verwendet, ist das ok?

Das Ganze brauche ich für 30 Werte, kann man das jetzt noch optimieren oder muss die Logic 30 mal anlegen mit 30 Ein/Ausgängen, Arrays, etc.

Danke, Servus.

Das k wird für die FOR_Schleife verwendet. Es wird 5 mal die Schleife abgearbeitet.
Wenn du einen FB machst, dann kannst du den Baustein 30 mal aufrufen mit verschiedenen Eingangsparameter.

bike
 
Zurück
Oben