What are Beckhoff tutorials?

Guide til Operatorer i Beckhoff TwinCAT 3 PLC

03/06/2018

Rating: 4.79 (6601 votes)

At mestre programmering i Beckhoff TwinCAT 3 PLC kræver en solid forståelse af de fundamentale byggeklodser, og blandt de vigtigste er operatorerne. Disse værktøjer er essentielle for at kunne udføre beregninger, sammenligninger og datamanipulation. TwinCAT 3 understøtter ikke kun alle standardoperatorer fra IEC 61131-3, men udvider også funktionaliteten med en række egne, specialiserede operatorer. Denne artikel vil guide dig igennem de forskellige typer af operatorer, belyse vigtige overvejelser omkring datatyper og systemarkitektur, og give dig praktiske eksempler, der kan hjælpe dig med at skrive mere forudsigelig og fejlfri kode. At forstå, hvordan din kode opfører sig på forskellige hardwareplatforme, er nøglen til at udvikle robuste automationsløsninger.

What operators does Beckhoff Automation TwinCAT 3 plc support?
Address operators Arithmetic operators Call operators Selection operators Bitshift operators Bitstring operators Namespace operators Numeric operators Type conversion operators Comparison operators Further operators © Beckhoff Automation TwinCAT 3 PLC supports all operators of the IEC 61131-3 standard...
Indholdsfortegnelse

Grundlæggende om Operatorer i TwinCAT 3

Operatorer i TwinCAT 3 fungerer meget ligesom funktioner og bruges til at udføre operationer på en eller flere variabler (operander). De er implicit kendt i hele projektet, hvilket betyder, at du ikke behøver at deklarere dem specifikt for at bruge dem. Mens de fleste er velkendte fra standard PLC-programmering, er det især Beckhoffs udvidelser og den måde, compileren håndterer beregninger på, der kræver særlig opmærksomhed.

Behandlingsrækkefølgen, også kendt som bindingsstyrken, for operatorer i Structured Text (ST) er afgørende for, hvordan komplekse udtryk evalueres. Det er altid god praksis at bruge parenteser for at sikre, at beregningerne udføres i den rækkefølge, du forventer, og for at forbedre kodens læsbarhed.

Særlige Overvejelser: Hardware og Datatyper

En af de mest kritiske faktorer, man skal være opmærksom på, når man arbejder med TwinCAT 3, er, at resultatet af visse operationer kan afhænge af den underliggende systemhardware. Dette gælder især for operationer med flydende kommatal (floating point) og operationer, der resulterer i et overflow eller underflow af datatypen.

Udfordringen med Overflow og Underflow

TwinCAT 3-compileren er designet til at optimere ydeevnen ved at generere kode, der er skræddersyet til den specifikke målenhed. Det betyder, at den altid beregner mellemresultater med den native størrelse, som målsystemet specificerer. For eksempel:

  • x86 og Arm® systemer bruges der som minimum 32-bit mellemværdier.
  • x64 systemer bruges der altid 64-bit mellemværdier.

Denne tilgang giver betydelige hastighedsfordele og giver ofte det forventede resultat. Men det betyder også, at et overflow eller underflow i en mindre datatype (som f.eks. en 16-bit WORD) muligvis ikke bliver afkortet (truncated) med det samme, hvilket kan føre til uventede resultater. Lad os se på nogle eksempler.

Eksempel 1: Addition uden afkortning

I dette eksempel lægges 1 til en WORD-variabel, der allerede har sin maksimale værdi. Resultatet gemmes i en DWORD.

VAR nVarWORD: WORD := 65535; nVarDWORD: DWORD; END_VAR nVarDWORD := nVarWORD + 1;

Resultatet i nVarDWORD vil være 65536. Fordi mellemresultatet beregnes med mindst 32-bit præcision, sker der ikke et 16-bit overflow. Værdien bliver ikke afkortet til 0, som man måske ville forvente, hvis beregningen var strengt 16-bit.

Eksempel 2: Sammenligning med uventet resultat

Her ser vi, hvordan manglende afkortning kan påvirke sammenligninger.

VAR nVar1: WORD := 65535; nVar2: WORD := 0; bVar1: BOOL; bVar2: BOOL; END_VAR bVar1 := (nVar1 + 1) = nVar2; // Bliver FALSE bVar2 := (nVar2 - 1) = nVar1; // Bliver FALSE

Begge sammenligninger, bVar1 og bVar2, evalueres til FALSE på både 32-bit og 64-bit hardware. I det første tilfælde bliver (nVar1 + 1) til 65536, som ikke er lig med nVar2 (0). I det andet tilfælde bliver (nVar2 - 1) til -1, som ikke er lig med nVar1 (65535). Mellemresultatet beholder sin fulde værdi og bliver ikke tvunget inden for WORD-datatypeområdet under selve beregningen.

What operators does Beckhoff Automation TwinCAT 3 plc support?
Address operators Arithmetic operators Call operators Selection operators Bitshift operators Bitstring operators Namespace operators Numeric operators Type conversion operators Comparison operators Further operators © Beckhoff Automation TwinCAT 3 PLC supports all operators of the IEC 61131-3 standard...

Eksempel 3: Afkortning ved tildeling

Afkortning sker dog, når resultatet tildeles en variabel af den mindre datatype.

VAR nVar1: WORD := 65535; nVar2: WORD := 0; nVar3: WORD; bVar1: BOOL; END_VAR nVar3 := (nVar1 + 1); // nVar3 bliver 0 bVar1 := (nVar3 = nVar2); // Bliver TRUE

Her bliver resultatet af (nVar1 + 1), som er 65536, tildelt til nVar3, som er en WORD. Under denne tildeling afkortes værdien, og nVar3 får værdien 0. Derfor bliver sammenligningen (nVar3 = nVar2) til TRUE.

Eksempel 4: Tvungen afkortning med typekonvertering

Den mest robuste metode til at kontrollere denne adfærd er at bruge en eksplicit typekonvertering. Dette tvinger compileren til at afkorte mellemresultatet til den ønskede datatypestørrelse, før det bruges videre.

VAR nVar1: WORD := 65535; nVar2: WORD := 0; bVar1: BOOL; bVar2: BOOL; END_VAR bVar1 := (TO_WORD(nVar1 + 1) = nVar2); // Bliver TRUE bVar2 := (TO_WORD(nVar2 - 1) = nVar1); // Bliver TRUE

Ved at bruge TO_WORD() sikrer vi, at resultatet af additionen og subtraktionen konverteres til en 16-bit værdi, før sammenligningen finder sted. TO_WORD(65535 + 1) bliver til 0, og TO_WORD(0 - 1) bliver til 65535. Dermed bliver begge sammenligninger TRUE, hvilket ofte er den forventede logik.

En Dybdegående Guide til Typekonverteringsoperatorer

Typekonvertering er en fundamental del af PLC-programmering, og TwinCAT 3 skelner mellem implicitte og eksplicitte konverteringer.

Implicitte vs. Eksplicitte Konverteringer

En implicit konvertering sker automatisk, når du tildeler en værdi fra en 'mindre' datatype til en 'større' datatype. For eksempel vil konvertering fra BYTE til INT eller fra WORD til DINT ske uden behov for en specifik operator, da der ikke er risiko for datatab.

En eksplicit konvertering kræver, at du kalder en specifik konverteringsoperator. Dette er nødvendigt, når du konverterer fra en større til en mindre datatype (hvor der er risiko for datatab) eller når du ønsker at specificere en konvertering for at sikre en bestemt adfærd, som vist i overflow-eksemplerne.

Den generelle syntaks for eksplicitte konverteringer er:

  • Typet konvertering:<elementær datatype>_TO_<en anden elementær datatype> (f.eks. DINT_TO_INT)
  • Overloaded konvertering:TO_<elementær datatype> (f.eks. TO_INT)

Tabel over Konverteringstyper

KonverteringstypeBeskrivelseEksempel
HeltalskonverteringKonvertering mellem forskellige heltalsstørrelser som SINT, INT, DINT, LINT.myInt := DINT_TO_INT(myDintVariable);
Boolsk konverteringKonverterer en numerisk værdi til BOOL. 0 bliver FALSE, alle andre værdier bliver TRUE.myBool := INT_TO_BOOL(myIntVariable);
Flydende kommatalskonverteringKonvertering mellem REAL, LREAL og heltalstyper.myReal := TO_REAL(myIntValue);
StrengkonverteringKonverterer en numerisk eller tidsbaseret værdi til en STRING eller WSTRING.myString := LREAL_TO_STRING(myLrealValue);
Dato- og tidskonverteringKonvertering mellem datotyper som TIME, DATE, DT (DATE_AND_TIME) og TOD (TIME_OF_DAY).myTime := DINT_TO_TIME(3600);

Vigtige Faldgruber ved Typekonvertering

  • Overskridelse af værdiområde: Hvis inputværdien til en konverteringsoperator er uden for mål-datatypens værdiområde, er resultatet udefineret og afhænger af platformen. Dette kan potentielt forårsage en undtagelsesfejl (exception error). For eksempel kan konvertering af en negativ LREAL til UINT give et uforudsigeligt resultat.
  • Tab af information: Når du konverterer fra en større datatype til en mindre (f.eks. LREAL til INT), kan du miste præcision eller hele værdien. Operatoren TRUNC (eller TRUNC_INT) kan bruges til eksplicit at fjerne decimaldelen af et flydende kommatal.
  • Strengmanipulation: Ved konvertering til STRING eller WSTRING bliver værdien venstrestillet. Hvis strengvariablen er for kort, vil resultatet blive afkortet. Sørg altid for at deklarere dine strengvariabler lange nok til at rumme det forventede resultat uden tab af data.

Ofte Stillede Spørgsmål (FAQ)

Hvorfor får jeg et resultat som 65536, når jeg lægger 1 til en WORD med værdien 65535?
Dette sker, fordi TwinCAT 3's compiler bruger målsystemets native bit-størrelse (typisk 32-bit eller 64-bit) til mellemregninger for at optimere ydeevnen. Derfor sker der ikke et 16-bit overflow i selve beregningen. Værdien afkortes først, når den tildeles til en 16-bit variabel, eller hvis du eksplicit bruger en TO_WORD() konvertering.
Hvad er den primære forskel på en implicit og en eksplicit typekonvertering?
En implicit konvertering sker automatisk og kun, når der ikke er risiko for datatab (typisk fra en mindre til en større datatype). En eksplicit konvertering kræver en specifik operator (f.eks. INT_TO_BYTE) og bruges, når der er risiko for datatab, eller for at tvinge en bestemt adfærd i en beregning.
Hvordan sikrer jeg, at mine beregninger altid holder sig inden for en bestemt datatypestørrelse, f.eks. 16-bit?
Den sikreste metode er at bruge en eksplicit typekonverteringsoperator omkring din beregning. For eksempel vil TO_WORD(udtryk) sikre, at resultatet af 'udtryk' afkortes til en 16-bit værdi, før det bruges i resten af linjen.
Er alle operatorer i TwinCAT 3 en del af IEC 61131-3 standarden?
Nej. Mens TwinCAT 3 fuldt ud understøtter alle operatorer defineret i IEC 61131-3, tilbyder Beckhoff også yderligere operatorer, der ikke er en del af standarden, for at give udvidet funktionalitet.
Hvad sker der, hvis jeg konverterer en værdi, der er for stor til mål-datatypen, f.eks. DINT=1000 til SINT?
Resultatet er udefineret og platformafhængigt. I bedste fald får du et afkortet og uventet resultat; i værste fald kan det resultere i en runtime-fejl. Det er programmørens ansvar at sikre, at værdier er inden for det gyldige område, før en konvertering, der kan medføre datatab, udføres.

Hvis du vil læse andre artikler, der ligner Guide til Operatorer i Beckhoff TwinCAT 3 PLC, kan du besøge kategorien Sundhed.

Go up