Search talk: codesys entercat

 
<< < 1 .. 907 908 909 910 911 .. 922 > >> (Page 909 of 922)

Post by kblundy on Change the Opening Position of the Dialog using VU.FbOpenDialog CODESYS Forge talk (Post)
I hope the community can help me with this. I need to use the Visu Utils FbOpenDialog to control the opening and closing of a dialog. I have the Opening and Closing working, but I can’t get the dialogue's position to be controlled. The code looks like this: PROGRAM OPEN_DIALOG VAR xOpenLatchSettingDialog : BOOL; TopLeftDialog : VisuStructPoint ; fbOpenLatchSettingsDialog : VU.FbOpenDialog ; END_VAR IF xOpenLatchSettingDialog THEN xOpenLatchSettingDialog:= FALSE ; TopLeftDialog.iX := 100; TopLeftDialog.iY := 23; fbOpenLatchSettingsDialog(sDialogName := 'visu_AlarmLatchSettings', xExecute := xOpenLatchSettingDialog , xModal := TRUE, itfClientFilter := VU.Globals.OnlyTargetVisu, pTopLeftPosition := ADR(TopLeftDialog)); CloseVisuDialog(sDialogName:= 'visu_AlarmLatchSettings'); ELSE xOpenLatchSettingDialog:= TRUE ; IF fbOpenLatchSettingsDialog.xError THEN xOpenLatchSettingDialog := FALSE; END_IF END_IF I can't seem to work out a way to make the values in TopLeftDialog.iX and TopleftDialog.iY be passed correctly in the call and for it to change the position of the dialogue box. The code is compiled, but the position has not been changed. Any guidance or suggestions for revising this code would be incredibly valuable. Your insights could be the key to solving this issue.
Last updated: 2024-05-05

Post by mxj262 on FB having single input but initialized with Array CODESYS Forge talk (Post)
I am adding elements of an ARRAY using pointer to access each element inside a FOR loop and the FOR loop does not stop! What is the right way to use pointers in such case?? I have another loop that is not using pointer and it stops but the loop using pointer keep on adding. METHOD FB_Init: BOOL VAR_INPUT bInitRetains: BOOL; // TRUE: the retain variables are initialized (reset warm / reset cold) bInCopyCode: BOOL; // TRUE: the instance will be copied to the copy code afterward (online change) END_VAR VAR_IN_OUT // basically REFERENCE TO window_buffer: ARRAY [*] OF INT; // array of any size END_VAR THIS^.windowPtr := ADR(window_buffer[0]); THIS^.windowSize := UPPER_BOUND(window_buffer, 1) - LOWER_BOUND(window_buffer, 1) + 1; FUNCTION_BLOCK FB500 VAR_INPUT END_VAR VAR_OUTPUT END_VAR VAR windowPtr: POINTER TO INT; windowSize: DINT; currentIndex: UINT; element1:INT; element2:INT; i:INT; j:INT; sum:DINT:=0; END_VAR element1:=windowPtr[0]; // read the first element of the Array dynamic memorry element2:=windowPtr[1]; FOR i:=0 TO (TO_INT(windowSize-1)) BY 1 DO // this loop does not stop Sum:=sum + windowPtr[i]; END_FOR FOR j:=0 TO 5 BY 1 DO // this loop stops j:=j+1; END_FOR https://ibb.co/k3DhkZT
Last updated: 2024-05-06

Post by wollvieh on Display minutes as hours & minutes CODESYS Forge talk (Post)
Here a code for an Operation Counter with : days,hours,minutes,seconds as an example, maybe it points you the right direction ? FUNCTION_BLOCK OperationDayHour VAR_INPUT IN : BOOL; // Betrieb Takt : BOOL; // 1Hz Systemtakt END_VAR VAR_OUTPUT BetrTag : UDINT; // Ausgabe Betriebstage Betrstd : UDINT; // Ausgabe Betriebsstunden Betrmin : UDINT; // Ausgabe Betriebsminuten Betrsec : UDINT; // Ausgabe Betriebsekunden BetrString : STRING; // Ausgabe als String END_VAR VAR ///Erkennung Taktflanke Flanke: R_TRIG; END_VAR VAR_IN_OUT BetrsecAbsolut: UDINT; //Ein/Ausgangsvariable Betriebssekunden RETAIN !!! END_VAR Flanke(CLK:= Takt, Q=> ); (*Erkennung Taktflanke*) IF (IN AND Flanke.Q) THEN (*Sekunden hochzählen*) BetrsecAbsolut := BetrsecAbsolut + 1; END_IF Betrsec := BetrsecAbsolut MOD 60; Betrmin := ( BetrsecAbsolut / 60) MOD 60; Betrstd := ( BetrsecAbsolut / 60 / 60 ) MOD 24; BetrTag := ( BetrsecAbsolut / 60 / 60 /24 ); BetrString := RIGHT ( UDINT_TO_STRING( BetrTag + 100000),5); BetrString := CONCAT (BetrString, 'd_'); BetrString := CONCAT (BetrString,RIGHT ( UDINT_TO_STRING( Betrstd + 100000),5)); BetrString := CONCAT (BetrString, 'h_'); BetrString := CONCAT (BetrString, RIGHT ( UDINT_TO_STRING( Betrmin + 100),2)); BetrString := CONCAT (BetrString, 'm_'); BetrString := CONCAT (BetrString, RIGHT ( UDINT_TO_STRING( Betrsec + 100),2)); BetrString := CONCAT (BetrString, 's');
Last updated: 2024-05-27

Post by caprez95 on Trace Restart Visuelement CODESYS Forge talk (Post)
Hallo zusammen. Ich habe schon länger mit dem Problem zu kämpfen, dass ich einen Trend (Visuelement) nicht resetten (neustarten) kann. Ich habe es jetzt mit dem Beispiel hinbekommen, die Trace-Aufzeichnung über die CmpTraceMgr Bibliothek zu steuern. Aber wie bekomme ich diese Trace-Aufzeichnung in ein Visuelement? Der Code sieht wie folgt aus: // Configure trace IF xInit THEN // Create a trace packet PacketConfig.pszName := ADR('IECTraceConfiguration.Trace1'); // Name of trace PacketConfig.pszApplicationName := ADR('IECTraceConfiguration'); // Name of the application PacketConfig.pszIecTaskName := ADR('Task'); // Name of the task PacketConfig.pszComment := ADR('Demo packet'); PacketConfig.ulEveryNCycles := 1; PacketConfig.ulBufferEntries := 1000; PacketConfig.ulFlags := TRACE_PACKET_FLAGS.TRACE_PACKET_FLAGS_TIMESTAMP_MS AND TRACE_PACKET_FLAGS.TRACE_PACKET_FLAGS_AUTOSTART; IF (NOT fbTraceManager.CreatePacket(PacketConfig := PacketConfig, hPacket=>hPacket1)) THEN xError := TRUE; END_IF // Create a trace record RecordConfig.pszVariable := ADR('iSignal'); // This is the name of variable to record RecordConfig.tcClass := INT_TO_UDINT(TypeClass.TYPE_INT); // Type of the recording variable RecordConfig.ulSize := SIZEOF(iSignal); // Size of the recording variable pApp := AppFindApplicationByName('IECTraceConfiguration', 0); AppGetAreaOffsetByAddress(pApp, ADR(iSignal), ADR(RecordConfig.tvaAddress.taAddress.Area.usArea), ADR(RecordConfig.tvaAddress.taAddress.Area.ulOffset)); // Get and set area offsets RecordConfig.tvaAddress.ulAddressFlags := TRACE_VAR_ADDRESS_FLAGS_IEC OR TRACE_VAR_ADDRESS_FLAGS_AREA_OFFSET; RecordConfig.ulGraphColor := 16#FF00FF00; // green RecordConfig.ulGraphType := 1; // Line with points IF (NOT fbTraceManager.AddRecord(RecordConfig := RecordConfig, hPacket := hPacket1, hRecord => hRecord1)) THEN xError := TRUE; END_IF xInit := FALSE; END_IF // Starts the recording IF xStart THEN IF (NOT fbTraceManager.StartPacket(hPacket := hPacket1)) THEN xError := TRUE; END_IF xStart := FALSE; END_IF // Stop the recording IF xStop THEN IF (NOT fbTraceManager.StopPacket(hPacket := hPacket1)) THEN xError := TRUE; END_IF xStop := FALSE; END_IF // Reset the recording IF xReset THEN IF (NOT fbTraceManager.ResetPacket(hPacket := hPacket1)) THEN xError := TRUE; END_IF xReset := FALSE; END_IF
Last updated: 2024-06-04

Post by caprez95 on Trace Restart Visuelement CODESYS Forge talk (Post)
Hello everyone. I've been struggling with the problem for a long time that I can't reset (restart) a trend (visual element). With the example I have now managed to control the trace recording via the CmpTraceMgr library. But how do I get this trace recording into a visual element? The code looks like this: // Configure trace IF xInit THEN // Create a trace packet PacketConfig.pszName := ADR('IECTraceConfiguration.Trace1'); // Name of trace PacketConfig.pszApplicationName := ADR('IECTraceConfiguration'); // Name of the application PacketConfig.pszIecTaskName := ADR('Task'); // Name of the task PacketConfig.pszComment := ADR('Demo packet'); PacketConfig.ulEveryNCycles := 1; PacketConfig.ulBufferEntries := 1000; PacketConfig.ulFlags := TRACE_PACKET_FLAGS.TRACE_PACKET_FLAGS_TIMESTAMP_MS AND TRACE_PACKET_FLAGS.TRACE_PACKET_FLAGS_AUTOSTART; IF (NOT fbTraceManager.CreatePacket(PacketConfig := PacketConfig, hPacket=>hPacket1)) THEN xError := TRUE; END_IF // Create a trace record RecordConfig.pszVariable := ADR('iSignal'); // This is the name of variable to record RecordConfig.tcClass := INT_TO_UDINT(TypeClass.TYPE_INT); // Type of the recording variable RecordConfig.ulSize := SIZEOF(iSignal); // Size of the recording variable pApp := AppFindApplicationByName('IECTraceConfiguration', 0); AppGetAreaOffsetByAddress(pApp, ADR(iSignal), ADR(RecordConfig.tvaAddress.taAddress.Area.usArea), ADR(RecordConfig.tvaAddress.taAddress.Area.ulOffset)); // Get and set area offsets RecordConfig.tvaAddress.ulAddressFlags := TRACE_VAR_ADDRESS_FLAGS_IEC OR TRACE_VAR_ADDRESS_FLAGS_AREA_OFFSET; RecordConfig.ulGraphColor := 16#FF00FF00; // green RecordConfig.ulGraphType := 1; // Line with points IF (NOT fbTraceManager.AddRecord(RecordConfig := RecordConfig, hPacket := hPacket1, hRecord => hRecord1)) THEN xError := TRUE; END_IF xInit := FALSE; END_IF // Starts the recording IF xStart THEN IF (NOT fbTraceManager.StartPacket(hPacket := hPacket1)) THEN xError := TRUE; END_IF xStart := FALSE; END_IF // Stop the recording IF xStop THEN IF (NOT fbTraceManager.StopPacket(hPacket := hPacket1)) THEN xError := TRUE; END_IF xStop := FALSE; END_IF // Reset the recording IF xReset THEN IF (NOT fbTraceManager.ResetPacket(hPacket := hPacket1)) THEN xError := TRUE; END_IF xReset := FALSE; END_IF
Last updated: 2024-06-04

Post by paulg on RasPi CAA Serial example - unexpected behavior during debug CODESYS Forge talk (Post)
I've trimmed down the CAA Serial Codesys example to only listen on one port but, when stepping through the Case structure in debug mode, it jumps out of the structure during a specific point in every scan (I'll point it out below after describing the setup and listing the code). I'm using a Pi 4 Model B, and I have an Arduino Nano Every plugged in via USB which is streaming the following serial message at 1 Hz: Time since opening connection: 1 s Time since opening connection: 2 s ...and so on. The Pi shows the Nano at /dev/ttyACM0 so I edited CODESYSControl_User.cfg to read: Linux.Devicefile=/dev/ttyACM The code in my PLC_PRG is (ignore some of the comments, I hadn't deleted them out from the original example): PROGRAM PLC_PRG VAR xStartTest : BOOL:= TRUE; iState : INT; xTestDone : BOOL;(* True, when the test was done succesfully *) (* Settings to communicate with the COM Port *) aCom1Params : ARRAY [1..7] OF COM.PARAMETER; como1 : COM.Open; comc1 : COM.Close; comw1 : COM.Write; comr1 : COM.Read; //sWrite : STRING := 'Test String!'; sRead : STRING(25); szRead : CAA.SIZE; xCom1OpenError : BOOL; xCom1CloseError : BOOL; xCom1WriteError : BOOL; xCom1ReadError : BOOL; END_VAR //This example shows the communication of two COM Ports with each other. //The first one writes a string of characters, which is read by the second one. //After successful execution, the two COM Ports are closed and the test is done. IF xStartTest THEN CASE iState OF 0: //The parameters are set for the COM Port aCom1Params[1].udiParameterId := COM.CAA_Parameter_Constants.udiPort; aCom1Params[1].udiValue := 1; // the correct Port should be adapted aCom1Params[2].udiParameterId := COM.CAA_Parameter_Constants.udiBaudrate; aCom1Params[2].udiValue := 115200; aCom1Params[3].udiParameterId := COM.CAA_Parameter_Constants.udiParity; aCom1Params[3].udiValue := INT_TO_UDINT(COM.PARITY.NONE); aCom1Params[4].udiParameterId := COM.CAA_Parameter_Constants.udiStopBits; aCom1Params[4].udiValue := INT_TO_UDINT(COM.STOPBIT.ONESTOPBIT); aCom1Params[5].udiParameterId := COM.CAA_Parameter_Constants.udiTimeout; aCom1Params[5].udiValue := 0; aCom1Params[6].udiParameterId := COM.CAA_Parameter_Constants.udiByteSize; aCom1Params[6].udiValue := 8; aCom1Params[7].udiParameterId := COM.CAA_Parameter_Constants.udiBinary; aCom1Params[7].udiValue := 0; //The first Port is opened with the given parameters como1(xExecute := TRUE, usiListLength:=SIZEOF(aCom1Params)/SIZEOF(COM.PARAMETER),pParameterList:= ADR(aCom1Params)); IF como1.xError THEN xCom1OpenError := TRUE; iState := 1000; END_IF //After a successful opening, the next state is reached IF como1.xDone THEN iState := 15; END_IF 15: // the reading process is started comr1(xExecute := TRUE,hCom:= como1.hCom, pBuffer:= ADR(sRead), szBuffer:= SIZEOF(sRead)); IF comr1.xError THEN xCom1ReadError := TRUE; END_IF //After completion the size of the written bytes are saved IF comr1.xDone OR comr1.xError THEN szRead := comr1.szSize; iState := 20; END_IF 20: // If everything was successful the ports are closed and the handles are released comc1(xExecute := TRUE,hCom:= como1.hCom); IF comc1.xError THEN xCom1CloseError := TRUE; END_IF IF comc1.xDone OR comc1.xError THEN iState := 25; END_IF 25: // The first port is closed and the used handle released xTestDone := TRUE; xStartTest := FALSE; iState := 0; como1(xExecute := FALSE); comw1(xExecute := FALSE); comc1(xExecute := FALSE); ELSE iState := 0; END_CASE END_IF I realize as I write this that the .udiPort should be 0 and not 1, but that shouldn't be causing the issue I'm seeing. I'm forcing xStartTest:=TRUE every scan so that I can step into each line and observe what's happening. What I see is that the port parameters are set and the port is opened with no errors, but the code jumps out of the case structure to the last line every time it reaches (and I step into) the iState:=15 line (at the end of the iState:=0 block). So every scan cycle it goes through the block for iState=0 and jumps out at the same spot. I'm a little new to PLC programming so I may be misunderstanding the flow, but shouldn't this case structure keep moving down in the same scan? If it only handles one case per scan, why doesn't the value of iState persist? Thanks! Update: I restarted the Codesys control today and I was then able to see an error for como1.eError of "WRONG_PARAMETER". I tried doing some digging and another post made me think I should add another line to CODESYSControl_User.cfg, so I now have: [SysCom] Linux.Devicefile=/dev/ttyACM portnum := COM.SysCom.SYS_COMPORT1 So now when I set .udiPort to 1, I get "NO_ERROR" but I also don't read anything from the port (i.e. szRead = 0 always). If I try setting the port to 0 (which I'm confused about, because I added a COMPORT1 line but the device shows on the Pi as ACM0), I get the "WRONG_PARAMETER" error again. Is there an easier way to troubleshoot the Pi and view what ports the Codesys runtime is actually able to see while the Pi is running?
Last updated: 2024-06-06

Post by rmaas on Strange Behavior on Raspberry Pi CODESYS Forge talk (Post)
Hello, what you are seeing is not strange behavior. The problem is that everyting is happening in the same program cycle. After the variable Stepnumber is changed from 10 to 20 for example then you want the program to wait with the next EQ until the next program cycle. Else every EQ will be be true because in every line the variable Stepnumber is increased. When the program arrives (still in the same cycle) at the line with the timer, the Stepnumber has been increased to 30 in the meantime and the timer will allway be ON because even though the variable is written to 10 in this line in the next cycle it starts with 10 and will be 30 again before reaching the timer in line 8. Not very good at explaining stuff but i hope you get the problem. See screenshot below for an example of one way you could solve this...
Last updated: 2024-06-18

Post by svenkaro on Codesyscontrol.service stoppt nach 30s CODESYS Forge talk (Post)
Wie Du schon vermutet hast, es meint, die Hardware/Firmware sei nicht kompatibel ... ooops... this runtime was built for RASPBERRYPI. Hardware version or firmware version not supported! (-18, 0x00000BB8, 0xFFFFFFFB) Architecture: aarch64 Byte Order: Little Endian CPU(s): 4 On-line CPU(s) list: 0-3 Vendor ID: ARM Model name: Cortex-A72 Model: 3 Thread(s) per core: 1 Core(s) per cluster: 4 Socket(s): - Cluster(s): 1 Stepping: r0p3 CPU(s) scaling MHz: 40% CPU max MHz: 1500.0000 CPU min MHz: 600.0000 BogoMIPS: 108.00 Flags: fp asimd evtstrm crc32 cpuid Caches (sum of all): L1d: 128 KiB (4 instances) L1i: 192 KiB (4 instances) L2: 1 MiB (1 instance) Vulnerabilities: Gather data sampling: Not affected Itlb multihit: Not affected L1tf: Not affected Mds: Not affected Meltdown: Not affected Mmio stale data: Not affected Retbleed: Not affected Spec rstack overflow: Not affected Spec store bypass: Vulnerable Spectre v1: Mitigation; __user pointer sanitization Spectre v2: Vulnerable Srbds: Not affected Tsx async abort: Not affected Allerdings habe ich schon reichlich Firmware versionen getestet.
Last updated: 2024-06-21

Post by joachimk on Profinet Controller IP-Adresse ändern CODESYS Forge talk (Post)
Die IP-Adresse des Profinet-Controllers soll zur Laufzeit geändert werden. Dabei handelt es sich um eine Anwendung auf einem PC mit einer Standard-Ethernetschittstelle (ControlWinV3+WinPcap). Die Datei "CODESYSControl.cfg" wurde dazu angepasst: .... Adapter.0.Name="Ethernet 4" Adapter.0.EnableSetIpAndMask=1 Die konfigurierte IP-Adresse wird zur Laufzeit an die tatsächliche IP-Adresse der Netzwerkschnittstelle mit dem folgenden Befehl angepasst (die Änderung von 192.168.2.33 auf 192.168.2.34 funktioniert auch): Ethernet.UpdateConfiguredIPSettings(IpAddress:=Ethernet.IPAddress, subnetmask:=Ethernet.Subnetmask, gateway:=Ethernet.GatewayAddress); Der Profinet-Controller geht danach auf Störung und gibt die folgende Fehlermeldung aus: "Controller-Status: currently active IP does not match the controller's configuration" Unter "Ethernet diagnostic information" kann man die geänderte IP-Adresse von 192.168.2.34. Ethernet läuft auch ohne Fehler. Unter "PROFINET IO Driver diagnostic information" -> "IPParameter" sieht man noch die alte (konfigurierte) IP-Adresse 192.168.2.33. Wie kann man die Störung beseitigen? Leider habe ich keine Methode zum Ändern der IP-Adresse auf dem Profinet-Controller gefunden? Reconfiguration des Profinet-Controllers?
Last updated: 2024-06-27

Post by vtec35 on search runtime 4.9.0.0 for pi 3 CODESYS Forge talk (Post)
yes but impossible to upload runtime 4.9.0.0 now we have put an image on the sd card with 4.13.0.0, i have 27 error message to this type, and if i test some output not work, et some work ------ Processus de compilation entamé : application : Device.HiddenOnlineConfigModeApp ------- Affecter un type à un code... [ERREUR] conditionneuse_camphre-ssa-05-02-24-V3 maj 241025: C0032: Le type 'Type inconnu : 'ADR(GVL_Io_73f6cbf3_7be8_4500_8421_47e565d899a0_HPS_1.Io_73f6cbf3_7be8_4500_8421_47e565d899a0_HPS_1)'' ne peut pas être converti en type 'POINTER TO IoConfigParameter' [ERREUR] conditionneuse_camphre-ssa-05-02-24-V3 maj 241025: C0077: Type inconnu : 'GVL_Io_73f6cbf3_7be8_4500_8421_47e565d899a0_HPS_1.Io_73f6cbf3_7be8_4500_8421_47e565d899a0_HPS_1' [ERREUR] conditionneuse_camphre-ssa-05-02-24-V3 maj 241025: C0046: Identificateur 'GVL_Io_73f6cbf3_7be8_4500_8421_47e565d899a0_HPS_1' non défini [ERREUR] conditionneuse_camphre-ssa-05-02-24-V3 maj 241025: C0032: Le type 'Type inconnu : 'ADR(GVL_Io_1b6dcc3b_ae11_4288_b9a9_86f9323448d1_HPS_1.Io_1b6dcc3b_ae11_4288_b9a9_86f9323448d1_HPS_1)'' ne peut pas être converti en type 'POINTER TO IoConfigParameter' [ERREUR] conditionneuse_camphre-ssa-05-02-24-V3 maj 241025: C0077: Type inconnu : 'GVL_Io_1b6dcc3b_ae11_4288_b9a9_86f9323448d1_HPS_1.Io_1b6dcc3b_ae11_4288_b9a9_86f9323448d1_HPS_1' [ERREUR] conditionneuse_camphre-ssa-05-02-24-V3 maj 241025: C0046: Identificateur 'GVL_Io_1b6dcc3b_ae11_4288_b9a9_86f9323448d1_HPS_1' non défini [ERREUR] conditionneuse_camphre-ssa-05-02-24-V3 maj 241025: C0032: Le type 'Type inconnu : 'ADR(GVL_Io_5ae6fa5a_c197_4038_9581_03e1650806a0_HPS_4.Io_5ae6fa5a_c197_4038_9581_03e1650806a0_HPS_4)'' ne peut pas être converti en type 'POINTER TO IoConfigParameter' [ERREUR] conditionneuse_camphre-ssa-05-02-24-V3 maj 241025: C0077: Type inconnu : 'GVL_Io_5ae6fa5a_c197_4038_9581_03e1650806a0_HPS_4.Io_5ae6fa5a_c197_4038_9581_03e1650806a0_HPS_4' [ERREUR] conditionneuse_camphre-ssa-05-02-24-V3 maj 241025: C0046: Identificateur 'GVL_Io_5ae6fa5a_c197_4038_9581_03e1650806a0_HPS_4' non défini [ERREUR] conditionneuse_camphre-ssa-05-02-24-V3 maj
Last updated: 2025-10-26

Post by farren on How to stay in a method until something is finished. CODESYS Forge talk (Post)
I know I'm thinking about this wrong -- too many decades of procedural and event-driven programming and only a few months of PLC ST programming...... I've created a visualization with a button that when pushed calls a method. I want the method to take a pressure reading, wait one minute and then take another pressure reading. I'm looking for leaks. I'm using TON for the delay. It seems like what is happening is that the method gets called once and it takes the first reading and starts the TON. But then execution continues, leaves that method call, and the second reading never happens. I can force the method to keep running until the whole thing is done with a While loop, but I understand that is considered BAD in PLC programming. If it push the button again to call the method again, it picks up where it left off and if the timer is complete then it runs the remaining code. How do I keep that method running until it is complete with just one call without using a while loop that ties up the PLC for a minute? Thanks! -Farren
Last updated: 2025-10-31

Post by jonasz on Deploy LicenseServer for Linux SL CODESYS Forge talk (Post)
So here's how: I manually installed the following packages: codemeter-lite_8.30.6885.501_amd64.deb codesyslicenseserver_licenseserver_4.18.0.0_all.deb codesyswbmbase_wbmbase_4.18.0.0_all.deb codesyswbmlicensing_wbmlicensing_4.18.0.0_all.deb Of course, the license server appeared immediately. Trying to install it again using Install in the Deploy tab, the same error appears. Of course, the information that such a server is already installed is also there. Configuring PLC, S_PLC, EDGE, and SAFE_TIMER_PROVIDER went smoothly, and basically everything works. I wrote a simple program for S_PLC. I'm loading the programs into PLC and S_PLC. When loading the program into S_PLC, a message appears stating that there is no connection to the S_PLC controller. Timeout error. Restart the controller, attempt to load, and see the above. After changing the cycle time for S_PLC to 50ms, the problem no longer occurs. My question, besides the difficulty of installation for a new user, is what causes the cycle time for S_PLC to be so long, and how can I fix it?
Last updated: 2025-11-14

Post by pernockham on How to recognize licenses SMALL, MEDIUM, LARGE by CmpCodemeter CODESYS Forge talk (Post)
Im trying to read out active license by CmpCodeMeter but am not sure of the combination of ProductCode and FeatureMap that each of CONTROL, VISU and COM / SMALL, MEDIUM, LARGE equals. Started by trying CodeMGetContentByFirmcode (and productCode) expecting error 18 / Not Available if asking for a higher level of license compared to what I know is active, but function just returned the requested productcode and a featuremap Is this the way or is it better to use CodeMOpen? Which seems to also require a featureCode. Where can I find info on required featureCode? ProductCodes according to google: Control (PLC Runtime) Small (S) 16#00002FFF 12287 * Medium (M) 16#00003000 12288 Large (L) 16#00003001 12289 Visualization (WebVisu) Small (S) 16#00003002 12290 Medium (M) 16#00003010 12304 * Large (L) 16#00003003 12291 Communication (Com) * Small (S) 16#00003004 12292 Medium (M) 16#00003005 12293 Large (L) 16#00003006 12294 Thanks!
Last updated: 2026-10-06

Post by josul on Alarm Manager - Disk IO Error and Memory Double Free Exception CODESYS Forge talk (Post)
I have encountered an issue with Alarm management. A simple Alarm table to display active alarms. Historical alarms can be hidden and can also be cleared. Overall a history of 10000 alarms before it cycles. On one instance this error displayed: "Some kind of disk I/O error ocurred. Check disk space". Picture attached. I have seen this with an online change, but it was resolved by a full download. But this case was running for weeks and displaying alarms fine. The logged errors though were unusual. Associated log entries (multiples of these were logged): 2026-10-07T12:17:17.603Z, 0x0000001f, 8, 1, 0, #### Exception: Memory double free detected: <cmp>AlarmConfig</cmp> <addr>0x80330d0</addr> And later in the same day, the entire application encountered an exception: 2026-10-07T19:33:48.583Z, 0x00000011, 8, 81, 3, #### Exception: *EXCEPTION* [<excpt>AccessViolation</excpt>] occurred: App=[<app>Application</app>], T> 2026-10-07T19:33:48.583Z, 0x00000011, 8, 81, 3, #### Exception: *SOURCEPOSITION* App=[<app>Application</app>] area=<area>0</area>, offset=<off>9548256> I haven't found any explanation for a "Memory double free detected" and I'm unsure how to prevent it occurring. I suspect it might be the cause of the "Access Violation" exception, but how can I be sure of this? Would defining VISU_NO_EXCEPTION_HANDLING be advisable or not in a production environment? Any advice is welcome.
Last updated: 2026-10-12

Post by bertus on Can't get SMC_SmoothPath to work CODESYS Forge talk (Post)
Hi Georg, thanks for your time. What is the value of D_ANGLE_TOL? It is set to 0.01. Do you need the assignment bAbort := NOT bDecoder? Does it help to leave it out? This seems to make no difference. Any errors (e.g. SMC_SmoothPath.Error/ErrorID) or PLC log messages? No errors or log messages. What if you comment out SMC_SmoothMerge and SMC_LimtiDynamics, is corner smoothing still not working? Indeed. Is bDecode written from a different task (e.g. visu)? Then I would recommend to assign to a local variable (bDecodeLocal := bDecode) and use that for all FBs. Otherwise, FBs might see different values of bDecode in a single cycle, which will cause problems. It is a local variable, written from a state machine inside this program. But there is new information: During some trial and error, I tried skipping "stage 2: merge short linear segments" (SMC_SmoothMerge). And suddenly it rounds the corners, see attached image. Looking a bit closer, I noticed that (with the original program) after a download (cold start?), it in fact did round the corners, but only once. Ever next cycle in which the NC program was executed, the corners where not rounded. Not sure if there is any relation, but SMC_SmoothMerge is also the only FB which has no bAbort input. Perhaps I need to reset it (or any buffers) by other means?
Last updated: 2025-12-18

Post by bmatlove on Re-create CoE online window in Visu CODESYS Forge talk (Post)
Hello, I am trying to re-create the CoE online window within a Visu for purposes of checking and interacting with device parameters occasionally for maintenance purposes. To minimize reliance on using the IDE for misc interactions. Ideally, I would like to exactly mimic the CoE online window within the IDE. I assume that it uses a few tricks to minimize overhead, such as only polling registers which are within the visual scope, for example. I'm afraid it might be too much to ask for a pre-built drop-in Visu module to exist for this task. Do I have any options aside from manually re-creating all the logic to do this, relying heavily on SdoInfo function blocks? Is there a way for me to reference the device ESI file to shortcut the process of determining how many registers there are and getting the address for each?
Last updated: 2025-12-27

Post by blitz on Can't get SMC_SmoothPath to work CODESYS Forge talk (Post)
This code works well: PROGRAM PLC_PRG VAR execute : BOOL; abort : BOOL; doMDI : BOOL; manualDataInput : STRING(1024) := 'N5 G01 X0.00 Y200.00 N6 G01 X200.00 Y200.00 N7 G01 X200.00 Y0.00 N8 G01 X0.00 Y0.00'; stringStreamArray: ARRAY[0..NUMBER_OF_CHAINS-1] OF SMC_StringStream2 ; i : UDINT; readNCFromStream : SMC_ReadNCFromStream; sentencesFromStringSteam : SMC_GSentenceQueue ; interpreter : SMC_NCInterpreter; interpreterGeoInfoBuffer: ARRAY[1..GEO_INFO_BUFFERS_SIZE] OF SMC_GeoInfo; roundPath : SMC_RoundPath; roundPathGeoInfoBuffer: ARRAY[1..GEO_INFO_BUFFERS_SIZE] OF SMC_GeoInfo; END_VAR VAR CONSTANT MDI_FILE_NAME : STRING := 'MDI.nc'; NUMBER_OF_CHAINS : UDINT := 15; GEO_INFO_BUFFERS_SIZE : DINT := 500; END_VAR readNCFromStream.bExecute := interpreter.bExecute := roundPath.bExecute := execute; readNCFromStream.bAbort := interpreter.bAbort := roundPath.bAbort := abort; IF doMDI THEN stringStreamArray[0].Init(MDI_FILE_NAME); stringStreamArray[0].AppendData(manualDataInput); stringStreamArray[0].SetEndOfData(); i := 0 ; WHILE i < NUMBER_OF_CHAINS DO readNCFromStream.aStream[i] := stringStreamArray[i]; i := i + 1 ; END_WHILE readNCFromStream.bExecute := TRUE; IF readNCFromStream.bBusy THEN ; END_IF END_IF readNCFromStream( fDefaultVel := 10, fDefaultAccel := 10, fDefaultDecel := 10, fDefaultVelFF := 10, fDefaultAccelFF := 10, fDefaultDecelFF := 10, sentences := sentencesFromStringSteam ); interpreter( sentences:= sentencesFromStringSteam, nSizeOutQueue:= SIZEOF(interpreterGeoInfoBuffer), pbyBufferOutQueue:= ADR(interpreterGeoInfoBuffer)); roundPath( poqDataIn := interpreter.poqDataOut, dRadius := , dAngleTol := , nSizeOutQueue := SIZEOF(roundPathGeoInfoBuffer), pbyBufferOutQueue := ADR(roundPathGeoInfoBuffer));
Last updated: 2026-01-09

Post by fredashbolt on Dynamically Update JSON Payload CODESYS Forge talk (Post)
I am trying to generate a JSON payload populated with a value that updates for use with a telemetry system, the payload is to be published by MQTT. I have established the MQTT client and can publish a working JSON payload but I can't get the payload to update as the value (iValue) changes. I am using a timer to trigger the .SetValue function periodically, but the JSON will only give the value as it is when it is first initialized using xFirst IF statement. Any suggestions? Thanks VAR pJsonData : POINTER TO JSON.JSONData := factory.Create(); fb_JBuilder : JSON.JSONBuilder; diRootIndex, diObject1Index : DINT; iValue : INT := 10 ; jsonArrayWriter : JSON.JSONByteArrayWriter; wsJsonData : WSTRING(1000); xFirst : BOOL := TRUE; utf8JsonData : STRING(2000); diTempVal : DINT ; PublishTimer : TON ; END_VAR IF xFirst = TRUE THEN fb_JBuilder ( pJsonData := pJsonData , diRootObj => diRootIndex ) ; diObject1Index := fb_Jbuilder.SetKeyWithObject ( "Device" , diParentIndex := diRootIndex ) ; diTempVal := fb_Jbuilder.SetKeyWithValue ( "Temp" , iValue , diParentIndex := diObject1Index ) ; xFirst := FALSE ; END_IF PublishTimer ( IN := PublishTimer.Q = 0 , PT := T#5S ) ; IF PublishTimer.Q THEN fb_JBuilder.SetValue ( iValue , diTempVal ) ; END_IF jsonArrayWriter( xExecute := PublishTimer.Q , pwData := ADR(wsJsonData), udiSize := SIZEOF(wsJsonData), jsonData := pJsonData^, xAsyncMode := FALSE ) ; JSON.Stu.ConvertUTF16toUTF8( ADR ( wsJsonData ) , ADR ( utf8JsonData ) , SIZEOF ( utf8JsonData ) , bStrictConversion := TRUE ) ;
Last updated: 2026-03-10

Post by jroddball79 on PM556-TP-ETH — How to change IP address without overwriting the PLC program? CODESYS Forge talk (Post)
Hi, I need to change the IP address of an ABB PM556-TP-ETH using ABB Automation Builder. The situation is: I have connectivity to the PLC using the current IP (configured in Communication Settings) Online Login works fine The Network Scan does not detect the PLC IP-Configuration tool shows all fields disabled I don't have the original project source, only an empty project The PLC has no SD card inserted The Online menu does not show an Upload option When I modify the IP in the project and connect, Automation Builder shows: "The PLC configuration needs to be updated. A full PLC download is required" I'm afraid a full download will overwrite the running program. Is there any way to change only the IP address without overwriting the application? I'm also open to solutions using third-party tools, Python scripts, or any other method (DCP protocol, direct TCP communication, etc.) as long as it doesn't overwrite the running application. Thank you
Last updated: 2026-05-19

Post by timvh on JSONByteArrayWriter string result incorrect order CODESYS Forge talk (Post)
See the example below. You can insert key/value pairs as required At first the JSON string will be filled with: "{$"Key1$": $"Value0$", $"Key2$": [{$"Key3$": 1, $"Key4$": 2}]}" With xAdd, you can insert items, which will result in: "{$"Key1$": $"Value0$", $"Key2$": [{$"Key3$": 1, $"Key4$": 2},{$"Key3$": 3, $"Key4$": 4}]}" VAR factory : JSON.JSONDataFactory; eDataFactoryError : FBF.ERROR; pJsonData : POINTER TO JSON.JSONData := factory.Create(eError => eDataFactoryError); fb_JBuilder : JSON.JSONBuilder; wsValue : WSTRING; diRootIndex, diObjectIndex1, diObjectIndex2, diObjectIndex3 : DINT; iValue : INT; jsonArrayWriter : JSON.JSONByteArrayWriter; wsJsonData : WSTRING(1000); xFirst : BOOL := TRUE; xWrite: BOOL; xAdd: BOOL; END_VAR IF xFirst THEN fb_JBuilder.Reset(); fb_JBuilder(pJsonData := pJsonData, diRootObj => diRootIndex); wsValue := "Value0"; fb_JBuilder.SetKeyWithValue("Key1", wsValue, diParentIndex := diRootIndex); diObjectIndex1 := fb_JBuilder.SetKeyWithArray(wsKey := "Key2", diParentIndex := diRootIndex); diObjectIndex2 := fb_JBuilder.SetObject(diParentIndex := diObjectIndex1); iValue := 1; fb_JBuilder.SetKeyWithValue("Key3", iValue, diParentIndex := diObjectIndex2); iValue := 2; fb_JBuilder.SetKeyWithValue("Key4", iValue, diParentIndex := diObjectIndex2); xFirst := FALSE; xWrite := TRUE; END_IF IF xAdd THEN xAdd := FALSE; diObjectIndex3 := fb_JBuilder.SetObject(diParentIndex := diObjectIndex1); iValue := 3; fb_JBuilder.SetKeyWithValue("Key3", iValue, diParentIndex := diObjectIndex3); iValue := 4; fb_JBuilder.SetKeyWithValue("Key4", iValue, diParentIndex := diObjectIndex3); xWrite := TRUE; END_IF IF xWrite THEN xWrite := FALSE; jsonArrayWriter( xExecute := TRUE, wsLinebreak := "", pwData := ADR(wsJsonData), udiSize := SIZEOF(wsJsonData), jsonData := pJsonData^, xAsyncMode := FALSE ); END_IF IF jsonArrayWriter.xDone OR jsonArrayWriter.xError THEN jsonArrayWriter(xExecute := FALSE, pwData := ADR(wsJsonData), udiSize := SIZEOF(wsJsonData), jsonData := pJsonData^, xAsyncMode := FALSE); END_IF
Last updated: 2026-06-14

Post by manuknecht on XY Chart causes extremely long cycle in Visu Task CODESYS Forge talk (Post)
I am using the visualization element "Cartesian XY Chart" in a visualization template within a library to display recorded position values. I managed to configure the chart as desired and it displays the values like it should. A problem occurs when clicking on the chart to move the cursor, zoom or pan. Upon clicking the visualization element for the first time, the task in which the visualization is run spikes to a cycle time of around 5'000 to 15'000 ms (the configured cycle time is 100 ms). Sometimes this even completely crashes the web-visualization. After this very long cycle, the visu task normalizes again and the chart can be interacted with as usual. Another spike in cycle time occurs once the visualization is switched to a frame that does not contain the chart. I did reduce the data array to only a few values and tried changing the update behaviour of the chart, but it did not change the problems I am facing. Did anyone experience a similar issue or even has a solution for this?
Last updated: 2026-06-16

Post by baltzer on ICertificateVerifier.VerifyCertificate doesn't appear to override an ERR_CERT_HAS_EXPIRED rejection in TCP_Client.Upgrade() CODESYS Forge talk (Post)
Setup: Net Base Services (NBS), TCP_Client + TLSContext, ePurpose := CLIENT_SIDE, connecting to a third-party embedded device (Velux KLF200 home automation gateway) whose factory-installed TLS certificate expired on 2026-07-12 and has no user-facing renewal path. Tested on both CODESYS Control for Raspberry Pi SL (3.5.19.0) and CODESYS Control Win V3 x64, with identical results on both. Goal: Accept the peer's expired certificate via a custom ICertificateVerifier implementation, since the certificate itself can never be replaced. Implementation: FUNCTION_BLOCK FB_MyCertVerifier IMPLEMENTS NBS.ICertificateVerifier VAR udiCallCount : UDINT; aeCurStateLog : ARRAY[0..9] OF NBS.RTS_IEC_RESULT; END_VAR METHOD VerifyCertificate : UDINT VAR_INPUT hCert : NBS.RTS_IEC_HANDLE; eCurState : NBS.RTS_IEC_RESULT; END_VAR IF udiCallCount < 10 THEN aeCurStateLog[udiCallCount] := eCurState; END_IF udiCallCount := udiCallCount + 1; VerifyCertificate := 0; // also tried: VerifyCertificate := eCurState; Wired in via tlsContext.itfCertVerifer := certVerifier at declaration time, alongside itfTLSContext := tlsContext set at TCP_Client's own declaration (per an earlier forum thread here on ensuring inline start-values on FB-typed variables are actually honored when nested one level deep - that fix was needed and worked correctly for getting the handshake to start at all). Observed: - VerifyCertificate is confirmed called exactly once per connection attempt (via the call counter above). - eCurState passed in = 0x709 = ERR_CERT_HAS_EXPIRED - correctly reflecting the actual state of the peer's certificate. - Packet capture confirms the full TLS 1.2 handshake completes correctly at the wire level: ClientHello -> ServerHello -> Certificate -> ServerKeyExchange -> ServerHelloDone -> our ClientKeyExchange/ChangeCipherSpec/Finished -> server's ChangeCipherSpec/Finished. Both sides successfully complete the cryptographic handshake. - Despite this, TCP_Client.Upgrade() subsequently returns NBS.ERROR.CONNECTION_ERROR, and the connection is torn down with a plain TCP FIN (not a TLS alert) roughly 7-8ms after our side ACKs the server's Finished message. - TCP_Client.eErrorID (inherited from LCon) remains NO_ERROR throughout - the failure is only visible via Upgrade()'s return value. - Returning 0 (ERR_OK/ERR_CERT_OK - confirmed via the CmpErrors2 Interfaces documentation that these are literally the same value) makes no difference. - Echoing eCurState back unchanged (on the theory that this callback might work like mbedTLS's native verify callback, where the incoming state is a flags value to be cleared/modified and returned, rather than paired with a separate fixed "accept" sentinel) also makes no difference. - Identical result across udiVerificationMode := 0, 1, and 2. - Importing the peer's certificate into the runtime's trusted certificate store via cert-import trusted makes no difference either. - With itfCertVerifer left at its default (no custom verifier) and udiVerificationMode := 2, the underlying engine sends its own fatal TLS alert (handshake_failure) immediately after receiving the peer's Certificate message - suggesting built-in validation may reject at the record layer independent of whether a custom verifier is even present. Questions: 1. Is there an additional step required for a custom ICertificateVerifier to actually override an ERR_CERT_HAS_EXPIRED (or more generally, any ERR_CERT_*) rejection, or is certificate validation enforced unconditionally for a CLIENT_SIDE TLSContext regardless of what the verifier returns? 2. Is 0/ERR_OK genuinely the correct "accept" return value for VerifyCertificate, or does it expect something else (a specific bit pattern, a different constant, a value that must be computed from hCert itself)? 3. Is there a supported way to connect to a peer presenting a certificate that is both self-signed and expired, short of the peer issuing a new certificate? Happy to share the full packet captures or additional test combinations if useful. Also worth noting for anyone finding this thread later: a maintained Node-RED library for this same device (node-red-contrib-velux-klf200, forked to handle this exact expired-certificate situation) solves it by disabling built-in TLS validation entirely (rejectUnauthorized: false) and doing fingerprint-based pinning by hand after the handshake completes, rather than relying on a validation callback - which may be the more realistic approach here too if ICertificateVerifier genuinely can't override this class of rejection. Thanks in advance /Jørgen Disclosure: most of the CODESYS code and this investigation was developed with the help of Claude (Anthropic's AI assistant) - the state machine design, SLIP/checksum implementation, and debugging methodology (including the packet capture analysis) were worked through in an extended back-and-forth with it. Posting here because we've run out of self-serviceable options and this now looks like it needs input from someone with visibility into NBS's actual implementation.
Last updated: 2026-07-26

Post by konstantin on CAM Motion Recover after STO CODESYS Forge talk (Post)
Hello Mr. Seidel, both the master and the slave axis are modulo. Basically the situation is as follows: One master cycle is 100 units. Slave's modulo length is 2000 units. In the CAM table I defined 10 master cycles on X axis - 1000 units and on the Y axis is the slave - 2000 units. Then depending on the master position 0 to 1000 units the slave's position is plotted on the Y axis - 0 to 2000 units. For example, while the master is executing the 3rd cycle i.e. above 200 units, I trigger the STO function of the slave and it stops. The master executed his cycle but the slave was stopped during the execution. How can I set the slave to continue the CAM sequence from the point where it stopped i.e. third cycle of the master? When I reset the slave error and sync again, everyrhing starts from master's 0 position. Best Regards Konstantin Kolev
Last updated: 2026-02-13

Post by ilya-vah on Table element issues CODESYS Forge talk (Post)
Hello, First post here. I would like to clarify whether the following behavior is known or if it is a bugs. Issue 1 — First row not displayed when using Maximum array index with 1-based arrays Description: When displaying data from an array that is indexed starting from 1 (e.g., ARRAY[1..N]), and the number of displayed rows is limited using the Maximum array index property, the first row of the array is not shown in the visualization. Steps to reproduce: Create an array indexed from 1 (e.g., ARRAY[1..N]). Bind the array to a Table element. Limit the number of displayed rows using the Maximum array index property. Run the visualization. Actual result: The first array element (index 1) is not displayed in the table. Issue 2 — Tooltip string placeholder cannot be bound to string variable from array Description: It is not possible to use a string placeholder in the tooltip that is bound to a string variable from the array. Steps to reproduce: Use a table bound to an array containing string variables. Configure a tooltip using a string placeholder referencing a string field from the array. Run the visualization. Actual result: Tooltip doesn't show any text. A test project demonstrating both issues is attached. Thank you for your time and support.
Last updated: 2026-02-16

Post by risele on Modbus connection via Qronox PCD3 M6893 CODESYS Forge talk (Post)
You are welcome. Also note, that it's valid only if you modbus-device use same real/float value representation (IEEE 754). That's true for most of systems. But some devices may have other representation, such as integer + position of the decimal point, for example 123.456 is integer = 123456 and position = 3 Also note, that, ones again, depending on endianess of each system, you may also need to swap not just words, but bytes. TYPE u_Real : UNION rVal:REAL; wVal:ARRAY[0..1] OF WORD; bVal:ARRAY[0..3] OF BYTE; dwVAL:DWORD; //same as previous, may be easier to specify the MB register END_UNION END_TYPE than swapping may be something as VAR A,B,C,D:BYTE; //Bytes of the real value uIn, uOut:u_Real; rVal:REAL; ModbusReg1,ModbusReg2:WORD; END_VAR uIn.rVal:=rVal; uOut.A:=uIn.D; uOut.B:=uIn.C; uOut.C:=uIn.B; uOut.D:=uIn.A; ModbusReg1:=uOut.wVal[0]; ModbusReg1:=uOut.wVal[2]; Or you even need to reorder bits... Ones again, sending float/real values is not defined by Modbus protocol itself, so it is hardware- and software-dependent. The Modbus Poll (and most of modbus tools) have configuration parameters that will properly swap bytes on their side. Ones again, that's very helpful: https://www.scadacore.com/tools/programming-calculators/online-hex-converter/
Last updated: 2026-02-19

<< < 1 .. 907 908 909 910 911 .. 922 > >> (Page 909 of 922)

Showing results of 23050

Sort by relevance or date