B&R ST nach C

knuppel

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

ich habe ein ST Programm, dieses soll aber in C geschrieben sein. Wie würde man folgenden Code als C Code schreiben?

Code:
(* WORKING STATE MACHINE *)
       CASE (instruction) OF
      
             mbMFC_READ_HOLDING_REGISTERS:
                    mbReadHolding.enable                    := 1;
                    mbReadHolding.pStation            := ADR(mb_station);
                    mbReadHolding.startAddress        := register_address;
                    //mbReadHolding.value                   := register_value;
                          
                    mbReadHolding.pData := ADR(input_values);
                    mbReadHolding.dataSize := SIZEOF(input_values);
                    xstatus:=mbReadHolding.status;
                    mbReadHolding();                                                                 (* call function block *)
                    IF (mbReadHolding.status <> ERR_FUB_BUSY) THEN
                           fub_status                 := mbReadHolding.status;
                           check_status        := TRUE;                   (* flag to check status *)
                           instruction_ready   := TRUE;                   (* flag marks instruction "ready" *)
                    END_IF
END_CASE

Was bedeutet dieses CASE XXX OF?
 
Bisschen habe ich etwas hinbekommen, aber wie programmiere ich
ADR(input_values);

in C? input_values ist ein Array
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Entspricht annähernd dem Switch in C, nur das keine breaks benötigt werden. mbMFC_READ_HOLDING_REGISTERS wird eine Konstante sein.

Sieht nach nem Beispiel für Mbus aus.


Hier was aus was anderem rauskopiert mit ähnlichem aufbau ( Sinnfrei)

switch
(AxisStep)

{

/******************** WAIT *************************/

case STATE_WAIT: /* STATE: Wait */

if (BasicControl.Command.Power == 1)

{

AxisStep = STATE_POWER_ON;

}

else

{

MC_Power_0.Enable = 0;

}



break;





}

 
ADR(input_values); liefert die Anfangsadresse der Variable zurück, also in dem Fall des Arrays.
 
Danke, dass hat schonmal geklappt,
der Funktionsaufruf passt bei mir noch nicht:
Code:
 mbReadHolding.enable             = 1;
    mbReadHolding.pStation         = &mb_station;
    mbReadHolding.startAddress     = register_address;

                
     mbReadHolding.pData = &input_values;
    mbReadHolding.dataSize = sizeof(input_values);
    xstatus=mbReadHolding.status;
    mbReadHolding();

Bringt bei mir called object 'mbReadHolding' is not a function
 
Bei C muss beim Bausteinaufruf die Instanz mitgegeben werden:

MC_MoveAdditive(&MC_MoveAdditive_0);

Heißt also: <Beusteinname in der Lib>(<&Instanzname>)
 
Hallo,

wie schreibe ich das hier:
strcpy(ADR(Smtp.Parameter.Host),ADR('10.43.10.254'));
Smtp.SmtpSend_0.pHost := ADR(Smtp.Parameter.Host);
in C?
 
Hallo,

Schau mal die AS Hilfe da. Sowas steht da drin. Hier mal direkt aus der Beschreibung der strcpy Funktion der AS Hilfe:

" adr = (UDINT) strcpy(string1, "Example");"



Auf deine Frage übertragen:

strcpy(Smtp.Parameter.Host , "10.43.10.2542");
 
Zuletzt bearbeitet:
Im Prinzip hast du recht
Aber :
String ist in C ein USINT Array und damit eine Adresse. Somit kann in diesem Fall auf das & verzichtet werden.
 
Zurück
Oben