Post by appling on License status of Linux 64Bit runtime via CLI
CODESYS Forge
talk
(Post)
Hi, I have a Linux 64Bit system with a Codesys application running on it. It stops after 2hours and a few minutes, which makes me think something is wrong with the installed license. (in my last timing it stopped after 2h4min, on the codesys website it is stated that runtimes without a license stop after 2h) I installed the license via a USB license dongle that I activated on my workstation with the Codesys IDE a while ago. Now the system is shipped at not accessible physically, only remotely via SSH. So is there a way to check the status of the License of the Codesys runtime when it is running on the system? Running the codesyscontrol script with "status" just tells me that it is running, but does not provide any license information. Best regards
Last updated: 2023-12-04
Post by dkugler on Management of a PLC network from a remote station
CODESYS Forge
talk
(Post)
I would figure out, how to create a simple html webpage with 2 frames. One frame with buttons to select the plc. A second frame with hyperlink to the webvisu of the plc ("XXX.XXX.XXX.XXX:8080/webvisu.htm"). Selecting other PLC Button has to change the hyperlink in 2. frame. Costs only some time to figure out :-) Or setup a raspberry Pi with small visualization. Set up a button for each plc and add one browser element. Each button writes the URL of the depending plc to the URL setting of the browserelement. Costs 55€ for runtime licence and a Raspberry Pi.
Last updated: 2023-12-04
Post by hyys12 on How to use/create SOTU in LD program
CODESYS Forge
talk
(Post)
I am trying to make a LD program for an existing installation with a motor. Here an inductive sensor is used to give an input, as a check to verify the conveyor is actually running. Here the plan was to use a TOF timer which gets constantly reset when the sensor input gets detected. The problem is, that if the conveyor is stuck, and the sensor sends a continous signal, the timer will never do what it is supposed to do. Therefor I need some help on how I can convert the input to a pulse, with the help of something like a SOTU. I just cannot find this in codesys anywhere.
Last updated: 2024-07-11
Post by opineiro on Stack overflow with really simple function
CODESYS Forge
talk
(Post)
Hi, I have an issue with a function which sends a message through API Rest. I'm using a function from httpCLient library. I have tested this function inside a program and it works fine. But when I want to use it inside a function (so I can call it simultaneously from 2 different points on the main program) it gives a stack overflow error. In detail it says: "C0297 Stack Overflow on Main Task. Stack sizes... Call hierarchy:" I have simplified as much as I can the function, but I'm hitting a wall with this. Anybody has an idea of what's wrong? Thanks!
Last updated: 2024-09-16
Post by ofey on OPC server crash
CODESYS Forge
talk
(Post)
Hi! I repeatly encounter a crash of the OPC server, which forces a reboot of the controller with frequent connect/disconnect to the server. Have any of you encountered this before? And is it a workaround? ie. deny that particular client connection by timeout or similar instead of crashing the PLC? This is during a development phase of the user interface. Up to 3 others connect/disconnect frequently to test their code. It is a bit troublesome of the PLC crashes several times a day because of this :( I greatly appreciate all comments. I hope it exists a fix for this, or something that hinders the crash. I attached the logfile for the crash
Last updated: 2024-11-26
Post by peterkcontrols on Copying 2 byte word to output
CODESYS Forge
talk
(Post)
Hello. I am using codesys 3.5. I would like to know if it is possible to set a variable to an output without declaring in. I have defined a STRUCT and within this struct I have a Struct for inputs called I and a struct for outputs called O. I have declared a variable of the type of this Struct, I would like to set or alias the value in this variable to an input/output value of an IO block that has a module on the ethernet tree. Is it possible to copy the contents of %IW0 -> STRUCT.I ? The size of both of these is 2 bytes. I understand that I can declare a variable with the input like Input01 AT %IX0.0 : BOOL; However how can I make STRUCT.I.D00 AT %IX0.0? Is this possible? Thanks
Last updated: 2025-03-03
Post by kut69 on Retain / Persistent Variables in Codesys for Raspberry Pi
CODESYS Forge
talk
(Post)
Hi, I am interested in details about the .ret file in the filesystem. I have already a project where the file is used (write on demand, read by start) and I want to share it as 'default input' for test devices using the identical application. Opening the .ret file content in a hex editor (I only use a single string retain var) I asked myself what the meaning of the first 24 bytes is. It neither contains a handle to the application nor a reference to the variable. Is this maybe a timestamp? Or a CRC/checksum? Regards, Thomas
Last updated: 2025-05-19
Post by durallymax on Dynamical scaling of bar graph without the bar itself
CODESYS Forge
talk
(Post)
I'm a fan of the analog indicators from ISA101. To recreate these, I use a number of rectangles that are dynamically sized and colored based on the input configuration. To keep it standard and easy, everything is built around 100px height. Then when instantiated in a frame, it can be resized as needed with the math remaining the same. The math logic is in a METHOD called by the rear most rectangle. These indicators do not use a "filling" bar graph, rather a fixed bar graph with a carrot to track the current value.
Last updated: 2025-06-06
Post by caliberbishop on Having trouble using the Web Client SL library
CODESYS Forge
talk
(Post)
Hello, I'm trying to use the Web Client SL library, I installed it in the IDE (did not purchase a license yet, as this is still a proof of concept so demo mode is good enough) and added it to the library manager. However, when trying to define a FB of the type WebClient I get a "Identifier 'WebClient' not defined" error message, setting the type to Web_Client_SL.WebClient did not work as well. Opening the example project the FBs defined there give the same error message. From the problem in the example project I deduce this is not a syntax problem, so maybe a license problem, but there should be a working demo mode, so what am I missing? IDE v 3.5.21.30 Library v 1.12.0.0 Thanks
Last updated: 2025-10-04
Post by mark on IO link on IFM AL133x only single digital input on a channel
CODESYS Forge
talk
(Post)
I have a problem with the CODESYS IO-Link SL software. When I insert a IO link master AL1332 and plug a discrete digital input to a channel it reads only 1 of the 2 available inputs on that channel. Is there anyone who sorted out if the second input is also usable? When we configure the module without the CODESYS IO-Link SL software then the second input on the channel can be used. At the moment we use some channels on a module as IO-link port, and some as discrete IO. It would be very nice if we can use both inputs on a channel with the use of CODESYS IO-Link SL.
Last updated: 2023-12-18
Post by davidbo on Does the new license policy means I have to upgrade everything?
CODESYS Forge
talk
(Post)
We have several old project written with 3.5.17 and 3.5.18 and also some older Until now when a customer ordered a product from us. We just installed (we have a tested image) and added a license Now the license policy has changed and we have to buy a License Control Basic S or M However it only works with CODESYS Development System Version 3.5.19.10 or higher Does that mean we have to upgrade all our old products? That is not a simple task as a previous post has explained with weird error messages from CODESYS V3.5. Next we have to do rigorous testing of our applications afterwards. It is very expensive
Last updated: 2024-01-11
Post by alexgooi on Function Blocks and arrays of function blocks
CODESYS Forge
talk
(Post)
Hi Jack, I think you have to look at a FB in a different way. A Function block (Class) can contain its own data. In other words don't define loose data in your GVL, but define a instance of a FB (Object) in your GVL: Example: Function_Block Basic_Class VAR_INPUT Open_Command: BOOL; END_VAR VAR_OUTPUT Opened: BOOL; END_VAR if Open_Command then Opened := TRUE; ELSE Opened := FALSE; END_IF Global Variables Objects: ARRAY[1..100] OF Basic_Class; //Here you ar defining you objects END_VAR In your code you can directly acces the data and couple it to the IO: GVL.Objects[1].Open_Command := %IX0.0; %QX0.0 := GVL.Objects[1].Opened; //To call the code itself use: GVL.Objects[1](); If you want to take this a step further you are also able to add methods and properties to the FB/Class end thereby creating a OOIP program
Last updated: 2024-02-15
Post by amy123 on codesys mqtt publish serialization
CODESYS Forge
talk
(Post)
Hello, I am using the CODESYS IIoT Libraries SL MQTT Publish. Does this publish block only support publishing STRINGS as a readable format? I can publish ENUM, STRUCT, BOOL; however, MQTT Explorer will only display strings. When I use Wireshark, I can see that it is publishing something, but it looks to be publishing a serialized version which is a bunch of 0s or random text. If so, is there any way to deserialize this information back into a readable format? See pictures, where I have a BOOL TRUE that gets published as 001. Then see where I publish a STRUCT and it's an incomprehensible combination of 0s - only the string variable is displayed. Or, is it expected that you convert everything to a string before publishing? Any help is greatly appreciated! :)
Last updated: 2024-02-16
Post by matt-purcell on Which Lib to use, connect to a socket with URL instead of IP address
CODESYS Forge
talk
(Post)
Hello, I have a new project and I need to connect to a TCP socket using the URL instead of an explicit IP address, myendpoint@mydomain.com Which library is best suited for this? This is for a new enterprise project, the endpoint is a server in a datacenter running some real time application. We have big IP, it will automatically reassign the IP address to the backup server if a crash occurs so an explicit IP won't work for me. I've done this in RS logix, working now to migrate that code over to codesys. Thanks in advance!
Last updated: 2024-06-17
Post by jbcregen on Accessing parameters from a structure or function block with the web interface
CODESYS Forge
talk
(Post)
I have a project with hundreds of OPC-UA variables available on the network. A lot of these variables are used actively in various scripts that run in background in the OS (Linux). I'm experimenting with Automation Server and I have a hard time understanding how the web interface populates its parameters list for a given PLC (<plc details="" parameters="" for="" plc="" 'xyz'="">).</plc> In this page, it looks like the only variables available are the ones that are of a "base" type : bool, TIME, String, INT, etc. All the variables that are nested into function blocks or structures are not available in the web interface, even if they are available to any OPC-UA client. Is this a limitation of the Automation Server or is there something that can be done in Codesys?
Last updated: 2025-12-01
Post by alexgooi on OPC-UA and other communication questions
CODESYS Forge
talk
(Post)
Dear forum, I currently have a big question mark above my head, and maybe this forum can shine some light on the situation. I recently updated to Codesys 3.15 SP19 Patch 6. And now I’m trying to setup the OPC-UA server, besides that I’m trying to connect to the controller with the Codesys V3 (Ethernet) protocol. OPC-UA I have installed the correct licenses on my controller (Runtime and communication). I’m able to connect to the controller with an OPC-UA client, and I’m able to browse the tags, so far so good. Therefore I’m assuming that the OPC-UA server is running on the controller. But now the strange part, in the device security settings I have set the communication Policy to BASCI256SHA256 ( I also have tried the other ones) and the communication mode is set to secure if possible (I also have tried all the other ones) (see picture). With these settings I would assume that I would only be able to login with a Basic256SHA256 policy with a client. But the opposite is true, I am able to login using the no policy mode and when I set it to Basic256SHA256 the client (UA-Expert) notes that this policy is not available on the server. I then check the certificates and I noted that there is no certificate for the OPC-UA server, I tried to generate one but it gave the error that the certificate has not been created by the device (See picture). To summarize I have no clue what is going on, and the controller does the opposite of what I would expect. Codesys Ethernet V3 driver I have a HMI connected to the same controller using the Ethernet V3 driver. But this will not connect. I tried all the Protocols (see picture), with and without the username and password enabled. But it will not connect, when I scan the available servers I can see the controller with the port number that I am expecting, so I’m assuming that the Codesys V3 ethernet driver is up on the controller. Does anyone can give me some direction, because the stuff that I tried doesn’t make sense to me. Thank you in advance
Last updated: 2024-04-02
Post by manuknecht on Opening a Dialog on a specific Client from ST
CODESYS Forge
talk
(Post)
I managed to find a solution that seems to work reliably. As the VU.Globals.CurrentClient-filter accesses the CURRENTCLIENTID or at least a similar, internal variable it can only be used if called from a certain client (e.g. from a button in a visualization). My solution works by implementing a new client filter that compares the client ID of all clients to the ID of the last client that was used. The variable containing the data of the last client is defined as: G_LastClient : VU.IVisualizationClient; // Copy of last client that detected click This last client is then updated every time a button is pressed using the Execute ST-Code input configuration of the button: G_LastClient := VU.PublicVariables.Clients.Current; Next, I created a function block that implements the client filter interface as so: FUNCTION_BLOCK FB_LastClientFilter IMPLEMENTS VU.IVisualizationClientFilter VAR_INPUT END_VAR VAR_OUTPUT END_VAR VAR END_VAR Then i added a method to the FB called IsAccepted which is used to filter out the client. When creating the method, it should automatically be filled with the according variable declaration, as it is defined in the interface: (* For every client can be desided, if it is accepted. ``TRUE``: Client is accepted*) METHOD IsAccepted : BOOL VAR_INPUT (* The client, to check*) itfClient : VU.IVisualizationClient; END_VAR Now the client can be compared to the last used client as such: // check if clientID corresponds to clientID of last recorderd client IF itfCLient.ClientId = G_LastClient.ClientId THEN IsAccepted := TRUE; ELSE IsAccepted := FALSE; END_IF To make use of this custom client filter, initialize a variable with the client filter: LastClient : FB_LastClientFilter; // Client filter to find last used client Then use this client filter when opening or closing a dialog from ST: fbOpenMyDialog(itfClientFilter:=LastClient,xExecute:=TRUE,sDialogName:='VIS_MyDialog_DLG');
Last updated: 2023-09-27
Post by micik on Download EtherCAT project on SoftPLC (ControlWin-V3 x64)
CODESYS Forge
talk
(Post)
Hello, I have almost exactly problem already discussed here in this old thread: https://forge.codesys.com/forge/talk/Engineering/thread/03af9426eb/ However, this is quite old and I assume not completely relevant. In my case, I use v3.5.20 on windows 11, so Winpcap is no longer supported on newer OS. Also, this hint about adding entry to the .cfg file under ProgramFiles(x86) is also not relevant anymore. I guess, I need to add entry SysEthernet to this .cfg file: C:\ProgramData\CODESYS\CODESYSControlWinV3x64...\CODESYSControl.cfg like this one: [ComponentManager] Component.1=CmpTargetVisuStub Component.2=CmpWebServer Component.3=CmpWebServerHandlerV3 Component.4=SysCpuMultiCore Component.5=SysReadWriteLock Component.6=SysCpuBreakpoints Component.7=SysPipeWindows Component.8=SysEthernet But I'm not sure about Npcap vs WinpCap. Please, if applicable, update these instructions.
Last updated: 2024-08-08
Post by micik on Ethercat project loaded to Win V3 x64 bit SoftPLC
CODESYS Forge
talk
(Post)
Hello, I have almost exactly problem already discussed here in this old thread: https://forge.codesys.com/forge/talk/Engineering/thread/03af9426eb/ However, this is quite old and I assume not completely relevant. In my case, I use v3.5.20 on windows 11, so Winpcap is no longer supported on newer OS. Also, this hint about adding entry to the .cfg file under ProgramFiles(x86) is also not relevant anymore. I guess, I need to add entry SysEthernet to this .cfg file: C:\ProgramData\CODESYS\CODESYSControlWinV3x64...\CODESYSControl.cfg like this one: [ComponentManager] Component.1=CmpTargetVisuStub Component.2=CmpWebServer Component.3=CmpWebServerHandlerV3 Component.4=SysCpuMultiCore Component.5=SysReadWriteLock Component.6=SysCpuBreakpoints Component.7=SysPipeWindows Component.8=SysEthernet But I'm not sure about Npcap vs WinpCap. Please, if applicable, update these instructions. I hope it is still possible to
Last updated: 2024-08-22
Post by mabac on No file found
CODESYS Forge
talk
(Post)
CODESYS introduced many cyber security related changes over the last few years, one of them is to restrict file access. By default, file access is restricted to the PlcLogic folder and subfolders of the CODESYS control runtime of version 3.5.19.0 and newer. For Control Win this would be the folder C:\ProgramData\CODESYS\CODESYSControlWinV3x64\xxxxxxxx\PlcLogic\ To enable access to other folders, you can configure additional paths by adding them to the file CODESYSControl.cfg. For example: [SysFile] FilePath=C:/temp/test FilePath.1=C:/Users/Public You should now be able to access your file in C:\temp\test\ or in C:\Users\Public
Last updated: 2024-10-30
Post by janber0206 on Adding PLC to the List view resolves in Unknown Error
CODESYS Forge
talk
(Post)
Hello, I try to add one of my PLC from the Gateways to the List view. The Gateway is shown me as online, also i have other remote tools to verify the Internet connection is working. I do the Network Scan and the Gateway shows up, i select it and click on "Add to Server". Then I type in Username and password and click on confirm. There it shows me the "Unkown Error", see screenshot. If I use the wrong credentials it gives me the error message for this. Other Devices work fine it's just this one. Greetings Jannis
Last updated: 2025-02-21
Post by fari on Configure J1939 I/O Mapping via Scripting
CODESYS Forge
talk
(Post)
Hi everyone, With the latest version of Codesys, it’s now possible to import DBC files directly into the J1939 Manager, which is great. However, I’m trying to achieve the same thing programmatically and can’t find any scripting functions related to import_dbc or any host_parameter that would let me configure PGNs and signal mappings automatically. So far, I’ve managed to add the J1939 Manager and an ECU, and I can pass the DBC database to it, but I’m stuck when it comes to adding the signals. Has anyone figured out if this can be done through scripting? (Attached is an illustration of what I am trying to accomplish programmatically). Thanks in advance.
Last updated: 2025-10-24
Post by kevintumibay on Struggling to connect to EK1100 to Raspberry Pi
CODESYS Forge
talk
(Post)
SUMMARIZED VERSION OF QUESTION: I'm trying to connect a Raspberry Pi running "Codesys Control for Raspberry Pi" to a Beckhoff EK1100, unfortunately, when I try to connect I get the following messages SEE FIRST PICTURE DETAILED VERSION OF QUESTION: Hi everyone, I'm a college student that is super interested in learning about PLCs. I wanted to dive into the subject and decided to follow this great Instructables article: https://www.instructables.com/Programming-Raspberry-Pi-With-CODESYS/ Thank you in advance for your help! My current setup is as follows: 1. I have Codesys Control for Raspberry Pi, version 4.14.0.0, (https://store.codesys.com/en/codesys-control-for-raspberry-pi-sl.html) installed on a Raspberry Pi 3B. 2. I am using my smartphone hotspot to create a network. 3. I have CODESYS 3.5 SP21 (64 bit) installed on my Windows 11 laptop. 4. Both the Raspberry Pi and my laptop are connected to the smartphone hotspot network (I am wirelessly connecting to the Raspberry Pi). Connecting to the Raspberry Pi from CODESYS on my laptop: 1. I launch Codesys Installer -> I install Codesys Control for Raspberry Pi (link to the software). 2. I launch Codesys 3.5 SP21 (64 bit) on my laptop. 3. I go to file --> new project --> standard project --> in the pop-up I select "Codesys Control for Raspberry Pi" and "Structured Text" 4. I click on tools -> Deploy Control SL (on older versions of Codesys you would click on "update Raspberry Pi", I got that information from this video: link) 5. Inside Deploy Control SL --> I go to the "communication" menu and I input the IP address of my Pi, the password, and click on connect. 6. Inside Deploy Control SL --> I go to the "deployment" menu and I install Codesys Control for Raspberry Pi SL and Codesys Edge Gateway for Linux 7. Now I double click on "device" in the left hand tree and put in the IP address of my Raspberry Pi and click on connect --> success! I am able to connect! SEE SECOND PICTURE Powering the EK1100 and connecting it to the Raspberry Pi: 1. I am supplying the EK1100 with 24 V across the + and - pins. 2. I have jumper wires going from the + pin to the 24V pin and from the - pin to the 0V pin. SEE THIRD PICTURE 4. I am pretty confident that the EK1100 is receiving power because the "LED Us 24 V" and "LED Up 24 V" are lighting up. 5. I then run an ethernet cable from the EK1100 to the Raspberry Pi port (the Raspberry Pi is connected to my laptop wirelessly over WiFi). I think this connection should also be good since the LINK/ACT LED lights up. Trying to connect to the EK1100: 1. Back in Codesys I right-click on "Device" in the left tree and then in the pop up I click on "add device". 2. I then click on EtherCAT Master. 3. Next in a terminal window I SSH into the raspberry Pi and run the "ifconfig" command. 4. From there I get the MAC address for eth0 --> in my case: b8:27:eb:29:a9:25 5. Then, back in Codesys I double click on "EtherCAT Master" in the left hand tree. I then paste the MAC address into the "Source Address (MAC)" field. 6. I go to the Beckhoff official website and download the XML files for EtherCAT: https://www.beckhoff.com/en-en/products/i-o/ethercat-terminals/ek1xxx-bk1xx0-ethercat-coupler/ek1100.html? 7. I unzip those files in my computer into some folder that I can remember. 8. Back in Codesys I click on "Tools" --> "Device Repository" --> "Install" --> and then on the "Beckhoff EK11xx.XML" file. 9. In theory the necessary XML file is now installed. 10. THIS IS WHERE I RUN INTO THE PROBLEM: I then click on login --> I right click on EtherCAT_Master and then scan for devices --> and nothing. 11. It just doesn't detect it. On top of this whenever I login I get those orange triangles on the left on my tree. When I check the Log I get the messages at the very first screenshot of this post. SEE FOURTH PICTURE Solutions that I have tried to resolve this problem: 1. I thought it was maybe the .XML file so I installed all the .XML files from the EtherCAT folder that I downloaded. That didn't fix it. 2. I went on the Wayback Machine and got the .XML files from 2018 as I thought maybe an older version would work. This file of EtherCAT folders had a .XML file named "Beckhoff EKxxxx.XML" I thought this would work because that's the name of the file the guy in the Instructables used (https://www.instructables.com/Programming-Raspberry-Pi-With-CODESYS/). That didn't do anything. 3. I ran the PLC on my computer instead of the Raspberry Pi and tried to connect to the EK1100, in case the issue was with the Raspberry Pi, but I still ran into the same error from the picture above: "Attention! The device was not found in the repository. Vendorcode: 0x0. Productcode: 0x0. Revision: 0x0". SEE FIFTH PICTURE 4. I reinstalled Codesys, I was originally on version 3.5 SP20 when I did this, I upgraded to 3.5 SP21 with no success. 5. I then thought the solution might be to first add the EK1100 hardware before connecting so I did the following: 6. Right click on "EtherCAT Master" on the left hand tree --> then click on "add device" --> then I added the "EK1100 EtherCAT Coupler (2A E-Bus)" MY THEORY OF WHAT IS CAUSING THE PROBLEM: I asked ChatGPT for help and it said that it might have something to do with the revision number. On the physical EK1100 it says "Rev. Nr.: 0018". I believe that this means that I need to a revision 0018 XML file but if you look in Codesys it says the version is 16 (picture above). This is confusing because I got my .XML file from the official Codesys website so it should be the most up to date version possible. I searched and I searched and I couldn't find a version 18 .XML file, I don't even now if this exists. Any help you can provide is greatly appreciated, I don't know what to do anymore and I really really want to get this working. Thank you!
Last updated: 2025-03-30
Post by mondinmr on Jitter problems on imx8
CODESYS Forge
talk
(Post)
We are experiencing serious jitter issues on an ARM64 imx8. Until now, on rpi and beaglebone derivatives, and on Intel, we never encountered jitter issues unless they were already present on the device. In this case, as can be seen from the attached graph, we have excellent maximum latency. The cyclictest on the isolated core dedicated to IEC CODESYS tasks shows a latency of 37µs, with an average of 14µs. Usually, on all other devices, with an RT kernel, with the appropriate parameters to avoid frequency throttling, with properly managed IRQs, and with the disabling of large page sizes, the jitter measured by CODESYS is very close to the cyclictest latency. However, on this imx8, we are noticing a fluctuating value of +/- 300µs that seems to be added to this latency, as if something occasionally miscalculates the sleep times by exactly +/- 300µs. Two screenshoot attached. - Result of cyclictest - Jitter on CODESYS Tasks are assigned to isolated core!
Last updated: 2023-10-18
Post by ofey on Testing of Codesys program
CODESYS Forge
talk
(Post)
Hi! I thought to hear what you guys think is the best way to test the program in my scenario. I have some PLC programs that have been made and deployed on different PLC's. The program has added the specific devices and IO that is applicable. I have made a test environment for everything outside of the PLC, ie. the same SCADA system that is talking to the PLC, and a program running locally is simulating the plant (level regulation of different tanks). Pr. now I have had to manually change the variables that are reading/writing values from the IO so they read/write via OPC instead. I also have to change the device tree from the specific PLC rack, to the soft PLC. So I kind of end up with two different programs that I have to maintain. I was just wondering if you believe there is an easier way to do this. So I can have the exactly same program and kind of switch between the soft mode, and the "real" mode.
Last updated: 2023-12-07
To search for an exact phrase, put it in quotes. Example: "getting started docs"
To exclude a word or phrase, put a dash in front of it. Example: docs -help
To search on specific fields, use these field names instead of a general text search. You can group with AND or OR.