Brauche Hilfe bei ner SCL -> AWL Übersetzung :-)

kai86

Level-1
Beiträge
158
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo kenne mich mit AWL nicht ganz so gut aus, ich programmiere lieber in SCL, aber ich darf nun aus SCL-Code AWL-Code machen :)

Habe was im Internet gefunden was etwas geholfen hat, aber so ganz passt das alles noch nicht. Also hier mein SCL und mein bisheriger AWL-Code

Code:
FUNCTION DCI_SendMessages: VOID    

BEGIN
NETWORK
TITLE =   DCI_SendMessages

U        DCI_Messages.MatReceivedFLAG
NOT

SPB        els1

Call DCI_STARTEVENT(MessageID:=21)        

Call DCI_WRITEINTPARAM(    id    := 102,
                         val    := Data.PortID)

CALL DCI_WRITEINTPARAM(    id  := 103,
                         val : =Data.SlotID)        

Call DCI_WRITESTRINGPARAM(    id  :=202, 
                            val :=Data.MaterialID)

U        FALSE
DCI_MESSAGECOMPLETE        

L        FALSE
=         #DCI_Messages.MatReceivedFLAG

els1:
end1:

U        DCI_Messages.MatRemovedFLAG
NOT

SPB        els2

L        22
DCI_STARTEVENT        

L        102
DCI_WRITEINTPARAM        DATA.PortID

L        103
DCI_WRITEINTPARAM        DATA.SlotID

L        202
DCI_WRITESTRINGPARAM        DATA.MaterialID

U        FALSE
DCI_MESSAGECOMPLETE        

U        FALSE
=         #DCI_Messages.MatRemovedFLAG

els2:
end2:
END_FUNCTION
So hier noch der SCL Code.

Code:
//File: DCI_SendMessages.scl
FUNCTION DCI_SendMessages:VOID
IF DCI_Messages.MatReceivedFLAG THEN
    DCI_StartEvent(MessageID:=21);
    DCI_WriteIntParam(id:=102, val:=Data.PortID);
    DCI_WriteIntParam(id:=103, val:=Data.SlotID);
    DCI_WriteStringParam(id:=202, val:=Data.MaterialID);
    DCI_MessageComplete();
    DCI_Messages.MatReceivedFLAG:=False;
END_IF;

IF DCI_Messages.MatRemovedFLAG THEN
    DCI_StartEvent(MessageID:=22);
    DCI_WriteIntParam(id:=102, val:=Data.PortID);
    DCI_WriteIntParam(id:=103, val:=Data.SlotID);
    DCI_WriteStringParam(id:=202, val:=Data.MaterialID);
    DCI_MessageComplete();
    DCI_Messages.MatRemovedFLAG:=False;
END_IF;

END_FUNCTION
dürfte ja eigentlich nicht so schwer sein oder?
 
Zuletzt bearbeitet:
was auch immer du vor hast...

in SCL proggen, übersetzen, Quelle aus dem Projekt entfernen, fertig ist der sehr leserliche AWL-code
 
Zuviel Werbung?
-> Hier kostenlos registrieren
für mich ist der absolut nicht leserlich :) hab das auch schon getestet.
Ok was ich vor habe. Ich generiere zur Zeit Code-Files aus einer Excel-Tabelle dies aber nur in SCL, dass kann aber nunmal nicht jeder übersetzen, deshalb will ich nun auch AWL-Code Files generieren. und dazu muss ich wissen wie ich IF s usw. in AWL bauen kann.

Grüße Kai
 
Ok mal auf meinen Code angewendet:
Code:
      U     #DCI_Messages.MatReceivedFLAG      
      SPBN  else
      CALL DCI_StartEvent(MessageID:=22);
      CALL DCI_WriteIntParam(id:=102, val:=Data.PortID);
      CALL DCI_WriteIntParam(id:=103, val:=Data.SlotID);
      CALL DCI_WriteStringParam(id:=202, val:=Data.MaterialID);
      CALL DCI_MessageComplete();
      U FALSE
      = #DCI_Messages.MatRemovedFLAG
      SPA   end
else: //hier else
end:  NOP   0

Ist das so richtig? AWL ist halt etwas fremd für mich :)
 
FUNCTION DCI_SendMessages: VOID

BEGIN
NETWORK
TITLE = DCI_SendMessages

U #DCI_Messages.MatReceivedFLAG
SPBN else
CALL DCI_StartEvent(MessageID:=22);
CALL DCI_WriteIntParam(id:=102, val:=Data.PortID);
CALL DCI_WriteIntParam(id:=103, val:=Data.SlotID);
CALL DCI_WriteStringParam(id:=202, val:=Data.MaterialID);
CALL DCI_MessageComplete();
U FALSE
= #DCI_Messages.MatRemovedFLAG
end: NOP 0

U #DCI_Messages.MatRemovedFLAG
SPBN else
CALL DCI_StartEvent(MessageID:=22);
CALL DCI_WriteIntParam(id:=102, val:=Data.PortID);
CALL DCI_WriteIntParam(id:=103, val:=Data.SlotID);
CALL DCI_WriteStringParam(id:=202, val:=Data.MaterialID);
CALL DCI_MessageComplete();
U FALSE
= #DCI_Messages.MatRemovedFLAG
end: NOP 0

END_FUNCTION
 
Zuviel Werbung?
-> Hier kostenlos registrieren
das sollte jetzt stimmen oder muss der NOP nur am ende vom ganzen AWL-Code?

du kannst

a) die selbe marke, in deinem fall "end" nicht zweimal verwenden und
b) das NOP 0 auch nur einmal schreiben, wenn du von der ersten IF in die nächste IF springst ...

NOP 0 ist eine nulloperation, die man benutzt um lücken zu füllen. ich würde sie z.B. drinnen lassen um der übersichtlichkeit genüge zu leisten
 
Also erstmal danke Vierlagig :-D
Code:
FUNCTION DCI_SendMessages: VOID	

BEGIN
NETWORK
TITLE =   DCI_SendMessages

U     #DCI_Messages.MatReceivedFLAG      
      SPBN  else
      CALL DCI_StartEvent(MessageID:=22);
      CALL DCI_WriteIntParam(id:=102, val:=Data.PortID);
      CALL DCI_WriteIntParam(id:=103, val:=Data.SlotID);
      CALL DCI_WriteStringParam(id:=202, val:=Data.MaterialID);
      CALL DCI_MessageComplete();
      U FALSE
      = #DCI_Messages.MatRemovedFLAG
end1:  NOP   0

U     #DCI_Messages.MatRemovedFLAG       
      SPBN  else
      CALL DCI_StartEvent(MessageID:=22);
      CALL DCI_WriteIntParam(id:=102, val:=Data.PortID);
      CALL DCI_WriteIntParam(id:=103, val:=Data.SlotID);
      CALL DCI_WriteStringParam(id:=202, val:=Data.MaterialID);
      CALL DCI_MessageComplete();
      U FALSE
      = #DCI_Messages.MatRemovedFLAG
end2

END_FUNCTION

Mal noch 2 Fragen, warum muss das else nicht unterschiedlich sein? Ist ja bestimmt kein befehlt oder? Und woher weiß das SPBN wo es hinspringen muss, wann sag ich dem das es zu end muss?
 
Mal noch 2 Fragen, warum muss das else nicht unterschiedlich sein? Ist ja bestimmt kein befehlt oder? Und woher weiß das SPBN wo es hinspringen muss, wann sag ich dem das es zu end muss?

och kleener, so wird das nichts.
das LABEL, also "endx" und "elsy" muss eindeutig sein, für jede einzelne IF-THEN-ELSE-Dingens ... also, hast du z.B. drei dieser Konstrukte bietet sich: SPBN end1, SPBN end2, SPBN end3 an...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sags doch gleich :p
Habe mich schon gewundert woher die das wissen ^^

Code:
FUNCTION DCI_SendMessages: VOID	

BEGIN
NETWORK
TITLE =   DCI_SendMessages

U     #DCI_Messages.MatReceivedFLAG      
      SPBN if1
      CALL DCI_StartEvent(MessageID:=22);
      CALL DCI_WriteIntParam(id:=102, val:=Data.PortID);
      CALL DCI_WriteIntParam(id:=103, val:=Data.SlotID);
      CALL DCI_WriteStringParam(id:=202, val:=Data.MaterialID);
      CALL DCI_MessageComplete();
      U FALSE
      = #DCI_Messages.MatRemovedFLAG
if1:  NOP   0

U     #DCI_Messages.MatRemovedFLAG       
      SPBN if2
      CALL DCI_StartEvent(MessageID:=22);
      CALL DCI_WriteIntParam(id:=102, val:=Data.PortID);
      CALL DCI_WriteIntParam(id:=103, val:=Data.SlotID);
      CALL DCI_WriteStringParam(id:=202, val:=Data.MaterialID);
      CALL DCI_MessageComplete();
      U FALSE
      = #DCI_Messages.MatRemovedFLAG
if2

END_FUNCTION

So jetzt stimmts aber oder? wenn nicht ist AWL doof
 
Wenn du sagst if2 muss noch abgeschlossen werden meinst du was damit???
if2: NOP???
Ich kenne mich mit AWL wirklich so gut wie gar nicht aus. Du sprichst für mich immer in rätseln :p
 
achso und wenn ich keine Anweisung habe schreibe ich einfach NOP da passiert dann halt nix. Ok danke für deine kurze einführung in AWL. falls ich nochmal ne frage dazu habe kommt die sicher demnächst hier rein ^^
 
Ok habs eben mal übersetzt es kommen 40 fehler.
Ich vermute mal ich muss noch was mit den Symbolen machen, weil da meckert der aber wie muss das aussehen?

Code:
(*File: DCI_SendMessages.AWL*)
(*Version: 1.0*)

FUNCTION DCI_SendMessages:VOID
NAME:     DCI_SMsg
FAMILY:   SCL
AUTHOR:   ICH
VERSION:  0.1
KNOW_HOW_PROTECT
Begin
NETWORK
Title = DCI_SendMessages

U     #DCI_Messages.FLAGMatRecv
SPBN  if1
  CALL DCI_StartEvent(MessageID:=500);
  CALL DCI_WriteStringParam(id:=100, val:=Data.MaterialID);
  CALL DCI_WriteIntParam(id:=101, val:=Data.InPort);
  CALL DCI_MessageComplete();
  U FALSE
  = #DCI_Messages.FLAGMatRecv
if1:  NOP   0

U     #DCI_Messages.FLAGProcStart
SPBN  if2
  CALL DCI_StartEvent(MessageID:=502);
  CALL DCI_WriteStringParam(id:=100, val:=Data.MaterialID);
  CALL DCI_WriteStringParam(id:=103, val:=Data.RecipeID);
  CALL DCI_MessageComplete();
  U FALSE
  = #DCI_Messages.FLAGProcStart
if2:  NOP   0

U     #DCI_Messages.FLAGProcFin
SPBN  if3
  CALL DCI_StartEvent(MessageID:=505);
  CALL DCI_WriteStringParam(id:=100, val:=Data.MaterialID);
  CALL DCI_WriteRealParam(id:=301, val:=Data.Temperature);
  CALL DCI_WriteIntParam(id:=302, val:=Data.Pressure);
  CALL DCI_WriteBoolParam(id:=303, val:=Data.ProcessResult);
  CALL DCI_MessageComplete();
  U FALSE
  = #DCI_Messages.FLAGProcFin
if3:  NOP   0

U     #DCI_Messages.FLAGMatRem
SPBN  if4
  CALL DCI_StartEvent(MessageID:=508);
  CALL DCI_WriteStringParam(id:=100, val:=Data.MaterialID);
  CALL DCI_WriteIntParam(id:=102, val:=Data.OutPort);
  CALL DCI_MessageComplete();
  U FALSE
  = #DCI_Messages.FLAGMatRem
if4:  NOP   0

END_FUNCTION
 
Zuviel Werbung?
-> Hier kostenlos registrieren
die lokalen variablen

#DCI_Messages.FLAGMatRecv
#DCI_Messages.FLAGProcStart
#DCI_Messages.FLAGProcFin
#DCI_Messages.FLAGMatRem

sind doch gar nicht angelegt.
oder sind es womöglich globale variablen? dann ohne # und in der Symboltabelle anlegen.
 
die sind global in nem DB namens DCI_Messages, welcher auch in der Symboltabelle so steht. Ohne # sinds trotzdem noch 40 Fehler.

der erste bei: SPBN if1
mit der meldung syntaxfehler
der nächste ist Typkonflikt für DCI_Messages
 
Zurück
Oben