The PLC Engine allows data processing in production lines.
It connects controllers, devices, SCADA systems and databases from various
manufacturers. It processes the data and dispatches them between the
connected devices and other systems. It collects data, manages them and
creates overviews for OEE applications.
Additional all the data can be handled over OPC. This are processed data and
all data from the connected controllers, devices, OPC systems and databases.
PLC Engine is the perfect component for using it for communications in
Industrie 4.0.
The configuration works in graphical style or with simple lists.
Lot of Wizards simplify this.
The example logs from barcode reader, adds a timestamp and writes both into a .csv file.
This example reads a barcode, gets the print data from a database and prints the result.
Diagnostics boost the startup in plants. Use Your smartphone or tablet and all of the status displays.
The diagnostics logger handles longer running information collecting.
The OPC UA implementation conforms to the specification 1.05.
The OPC UA Standard Model is supported, some extensions exist.
The maximum single request and answerlen is 16m
The OPC UA Alarms & Conditions module is supported. This includes filters, history.
An internal discovery server is active on standard, it supports multicast discovery also.
It can be used as a global discovery server.
Alternatively an external discovery server can be configured.
Reverse connections are supported.
The certificate management GDS Push is supported.
The session timeout will be limited to one hour.
The server and client certificate will be renewed if the Tani self signed certificate is used. All other certificates remain unaffected on expiring.
The certificate validity is checked all 12h.
It will be renewed seven days before it expires.
Running connections will not be affected, new connections will use the new certificate.
AddNodes is supported with the following restrictions:
Machine models from the OPC Foundation or the VDMA directly can be loaded with its corresponding XML file.
The security certificate key minimum length are
All controllers will be connected over network. Often this is Ethernet, WLAN or other networks. All serial Ethernet and MPI Ethernet gateways for industrial controllers usage are supported.
Connections to devices and controllers are supporting network redundancy.
Double and triple redundancy can be selected.
Two redundancy operation modi are possible.
In dynamic redundancy any of the connections is working as master. If it breaks another connection becomes the master connection.
In static redundancy the first connection is the master. If it breaks another connection becomes the master. If the first connection works again it will become the master connection again.
The connections of the redundancy should work on different netaork adapters.The adapters need different IP subnets for proberly work..
BACnet will be used over IP / UDP.
Maximum length of strings: 256 Byte
Status text elements are supported (state_text)
Supported charsets: UTF-8, UTF-16, Latin-1
Unions ("Choice") and structures ("Sequence") are existing for important values as trend, shedule, calendar, prioriry.
The trend data are offered as history data.
All unimplemented instances will not be shown.
Enum values are represented as UINT32. Some special enum are handled as bool.
Values in "Octet-String" and "Bit-String" can be written in whole only.
BBMD will be used during the connection establishing and the device search
if the devices do not be all in the same collision domain.
BACnet uses broadcast during ist connection establishing.
There are several procedures in BBMD:
COV represents the event subsystem of BACnet.
Events will be offered in browsing the variables, they will be subscribed.
If the device will send the data the event will be generated.
Because BACnet is working with UDP the COV receive can not be guaranteed.
Tani is offering an option: If no event will be received during the reconnection time from the configured connection it will be polled.
If the value did not change no event is send for this polling.
This mechanism was chosen to allow choosing the write priority via OPC without changing the read syntax for present-value property. This also allows writing NULL values via OPC.
The following object properties are implemented:
Object Type | Property | BACnet Type | OPC Type | Remarks |
---|---|---|---|---|
all | all | BACnetObjectIdentifier | UInt32 | |
all | all | Bit String | Array of Boolean | |
all | all | Boolean | Boolean | |
all | all | Character String | String | |
all | all | Double | Double | |
all | all | Enumerated | UInt32 | |
all | all | Octet String | Array of UInt8 | |
all | all | Real | Float | |
all | all | Signed | Int32 | |
all | all | Unsigned | UInt32 | |
all | Change of State Time (16) | BACnetDateTime | DateTime | |
all | Event Time Stamps (130) | Sequence of BACnetTimeStamp | Array of Structure "Timestamp" | |
all | Object Type (79) | BACnetObjectType | UInt32 | |
all | Time of Active Time Reset (114) | BACnetDateTime | DateTime | |
all | Time of State Count Reset (115) | BACnetDateTime | DateTime | |
Access Door (30) | Door Alarm State (226) | BACnetDoorAlarmState | UInt32 | |
Access Door (30) | Present Value (85) | BACnetDoorValue | UInt32 | |
Access Door (30) | Priority Array (87) | BACnetPriorityArray | Array(1..16) of Structure "UnsignedPriorityValue" | see section "Priority Array" |
Access Door (30) | Status Flags (111) | BACnetStatusFlags | Array(0..3) of Boolean | |
Analog Input (0) | Present Value (85) | Real | Float | |
Analog Input (0) | Status Flags (111) | BACnetStatusFlags | Array(0..3) of Boolean | |
Analog Output (1) | Present Value (85) | Real | Float | |
Analog Output (1) | Priority Array (87) | BACnetPriorityArray | Array(1..16) of Structure "AnalogPriorityValue" | see section "Priority Array" |
Analog Output (1) | Status Flags (111) | BACnetStatusFlags | Array(0..3) of Boolean | |
Analog Value (2) | Present Value (85) | Real | Float | |
Analog Value (2) | Priority Array (87) | BACnetPriorityArray | Array(1..16) of Structure "AnalogPriorityValue" | see section "Priority Array" |
Analog Value (2) | Status Flags (111) | BACnetStatusFlags | Array(0..3) of Boolean | |
Averaging (18) | Maximum Value Timestamp (149) | BACnetDateTime | DateTime | |
Averaging (18) | Minimum Value Timestamp (150) | BACnetDateTime | DateTime | |
Binary Input (3) | Present Value (85) | BACnetBinaryPV | UInt32 | |
Binary Input (3) | Status Flags (111) | BACnetStatusFlags | Array(0..3) of Boolean | |
Binary Output (4) | Present Value (85) | BACnetBinaryPV | UInt32 | |
Binary Output (4) | Priority Array (87) | BACnetPriorityArray | Array(1..16) of Structure "UnsignedPriorityValue" | see section "Priority Array" |
Binary Output (4) | Status Flags (111) | BACnetStatusFlags | Array(0..3) of Boolean | |
Binary Value (5) | Present Value (85) | BACnetBinaryPV | UInt32 | |
Binary Value (5) | Priority Array (87) | BACnetPriorityArray | Array(1..16) of Structure "UnsignedPriorityValue" | see section "Priority Array" |
Binary Value (5) | Status Flags (111) | BACnetStatusFlags | Array(0..3) of Boolean | |
Calendar (6) | Datelist (23) | List of BACnetCalendarEntry | Array() of Structure "BACnet.CalendarEntry" | |
Device (8) | Last Restore Time (87) | BACnetTimeStamp | Structure "Timestamp" | |
Device (8) | Local Date (56) | Date | Structure "Date" | |
Device (8) | Local Time (57) | Time | Structure "Time" | |
Device (8) | Object List (76) | Sequence of BACnetObjectIdentifier | Array of UInt32 | |
Device (8) | Protocol Object Types Supported (96) | BACnetObjectTypesSupported | Array of Boolean | |
Device (8) | Protocol Services Supported (97) | BACnetServicesSupported | Array of Boolean | |
Device (8) | Segmentation Supported (107) | BACnetSegmentation | UInt32 | |
Device (8) | System Status (112) | BACnetDeviceStatus | UInt32 | |
Device (8) | Time of Device Restart (203) | BACnetTimeStamp | Structure "Timestamp" | |
Event Enrollment (9) | Object Property Reference (78) | BACnetDeviceObjectPropertyReference | Structure "DeviceObjectPropertyReference" | |
File (10) | Modification Date (149) | BACnetDateTime | DateTime | |
Life Safety Point (21) | Present Value (85) | BACnetLifeSafetyState | UInt32 | |
Life Safety Point (21) | Status Flags (111) | BACnetStatusFlags | Array(0..3) of Boolean | |
Life Safety Zone (22) | Present Value (85) | BACnetLifeSafetyState | UInt32 | |
Life Safety Zone (22) | Status Flags (111) | BACnetStatusFlags | Array(0..3) of Boolean | |
Load Control (28) | Actual Shed Level (212) | BACnetShedLevel | Structure "ShedLevel" | |
Load Control (28) | Duty Window (213) | Unsigned | UInt32 | |
Load Control (28) | Expected Shed Level (214) | BACnetShedLevel | Structure "ShedLevel" | |
Load Control (28) | Present Value (85) | BACnetShedState | UInt32 | |
Load Control (28) | Requested Shed Level (218) | BACnetShedLevel | Structure "ShedLevel" | |
Load Control (28) | Shed Duration (219) | Unsigned | UInt32 | |
Load Control (28) | Start Time (142) | BACnetDateTime | DateTime | |
Loop (12) | Controlled Variable Reference (19) | BACnetDeviceObjectPropertyReference | Structure "DeviceObjectPropertyReference" | |
Loop (12) | Manipulated Variable Reference (60) | BACnetDeviceObjectPropertyReference | Structure "DeviceObjectPropertyReference" | |
Loop (12) | Setpoint Reference (109) | BACnetSetpointReference | Structure "SetpointReference" | |
Loop (12) | Present Value (85) | Real | Float | |
Loop (12) | Status Flags (111) | BACnetStatusFlags | Array(0..3) of Boolean | |
Multi State Input (13) | Alarm Values (7) | Sequence of Unsigned | Array of UInt32 | |
Multi State Input (13) | Fault Values (39) | Sequence of Unsigned | Array of UInt32 | |
Multi State Input (13) | Present Value (85) | Unsigned | UInt32 | |
Multi State Input (13) | Status Flags (111) | BACnetStatusFlags | Array(0..3) of Boolean | |
Multi State Output (14) | Present Value (85) | Unsigned | UInt32 | |
Multi State Output (14) | Priority Array (87) | BACnetPriorityArray | Array(1..16) of Structure "UnsignedPriorityValue" | see section "Priority Array" |
Multi State Output (14) | Status Flags (111) | BACnetStatusFlags | Array(0..3) of Boolean | |
Multi State Value (19) | Alarm Values (7) | Sequence of Unsigned | Array of UInt32 | |
Multi State Value (19) | Fault Values (39) | Sequence of Unsigned | Array of UInt32 | |
Multi State Value (19) | Present Value (85) | Unsigned | UInt32 | |
Multi State Value (19) | Priority Array (87) | BACnetPriorityArray | Array(1..16) of Structure "UnsignedPriorityValue" | see section "Priority Array" |
Multi State Value (19) | Status Flags (111) | BACnetStatusFlags | Array(0..3) of Boolean | |
Notification Class (15) | Recipient List (102) | List of BACnetDestination | Array() of Structure "BACnet.Destination" | |
Schedule (17) | Effective Period (32) | BACnetDateRange | Structure "DateRange" | |
Schedule (17) | Exception Schedule (38) | Sequence of BACnetSpecialEvent | Array of Structure "SpecialEvent" | |
Schedule (17) | List of Object Property References (54) | Sequence of BACnetDeviceObjectPropertyReference | Array of Structure "DeviceObjectPropertyReference" | |
Schedule (17) | Present Value (85) | ABSTRACT-SYNTAX.&Type | Structure "Any" | |
Schedule (17) | Schedule Default (174) | ABSTRACT-SYNTAX.&Type | Structure "Any" | |
Schedule (17) | Weekly Schedule (123) | Sequence Size(7) Of BACnetDailySchedule | 7 sub-objects ("Monday", "Tuesday", ...) of Structure "TimeValue" | |
Pulse Converter (24) | Present Value (85) | Real | Float | |
Pulse Converter (24) | Status Flags (111) | BACnetStatusFlags | Array(0..3) of Boolean | |
Structured View (29) | Subordinate List (211) | Sequence of BACnetDeviceObjectReference | Array of Structure "DeviceObjectReference" | |
Trend Log (20) | Client COV Increment (127) | BACnetClientCov | Structure "ClientCov" | |
Trend Log (20) | Log Buffer (131) | BACnetLogRecord | Structure "LogRecord" | Accessed via "HistoryRead" function, "Read" shows only one record. |
Trend Log (20) | Log Device Object Property (132) | BACnetDeviceObjectPropertyReference | Structure "DeviceObjectPropertyReference" | |
Trend Log (20) | Start Time (142) | BACnetDateTime | DateTime | |
Trend Log (20) | Stop Time (143) | BACnetDateTime | DateTime |
PLC Engine is a database client. It connects with user and password to the database.
The standard SQL statements INSERT INTO, UPDATE, SELECT, DELETE, FUNCTION and PROCEDURE will be used over the wizards. Other statements will be configured directly.
Supported are:
For using PLC Engine on a PC the locally installed databases can be used also.
On PLC Engine Device a My SQL database is installed. This database will be managed completely by PLC Engine.
The OPC Server contains a logger for diagnostics purposes during plant startup. The logger can be configured. The system load can be big if all controller data in big plants are logged.
Maximum number of configurable client connections: 4000.
Maximum length of a single item: 4GB.
Maximum number of elements each connection: 1 million.
Maximum number of elements (Items): 16 million.
Maximum OPC groups each connection: 100.
Maximum number of passive connection for each port is 999.
The OPC synchronous functions returning a bad quality immediately if the PLC
connection is not established.
Changes in controller configuration will be checked all 10 seconds if the PLC does not offer a mechanism for this check during write.
Fields can be up to 64K in length each.
Multi dimensional arrays can have up to six dimensions.
Fields can be up to 64K in length each.The maximum amount of configurable
logic tables is 60000.
The maximum length of one logic table is 4GB.
Maximum number of entries on a logic element 60000.
File operations can handle up to 64K in each request. Adding data to a file is limited only by the space on the disk.
Multi dimensional arrays can have up to seven dimensions.
Logic tables are constructed for linear logic. Loops are not possible.
A sequence chain supports the maximum of 65535 steps each.
All logic elements which functions can fail are supporting an OK bit. The user need handle this preventing unexpected run-time behavior.
Structures can not contain loops.
A structure or variable can be up to 4GB in its size.
The status diagnostics lists are supporting arrays up to 100 values each. If an array is longer than 100 values the first 100 elements are shown only. Writing this array is not possible.
The consumed computation time is depending on the load with communication.
Most the time it will be waited for controller data or OPC application
reaction.
All software is working with events. This maximizes the throughput and
minimizes the usage of computation time.
Multiple CPU are supported. Up to ten CPU will be used, the main work will
be handled by three CPU.
The installation does depending on the product install multiple parts
separately. On uninstall not all products are deleted automatically. But all
installed products can be deleted over the menu or the software part in the
system control manager.
The user settings will be preserved and not deleted during uninstall.
Type Auto-Import works for all client protocols that are able to use structures/enumerations and have online browsing functions. This includes:
These protocols have a fixed list of structures and don't need Auto-Import:
These protocols have online browsing, but don't use structures/enumerations:
All other protocols don't have online browsing.
Type Auto-Import is implemented in two steps:
Limitations:
Before Auto-Import Step 1, any types that have not been imported yet:
Before Auto-Import Step 2, any types that have not been imported yet:
After Auto-Import Step 2:
A client wishing to use a variable with a structure/enumeration type that has not been imported should
to trigger the type import. Only after completing one of these the structure type is available in the server.