Fully configurable OPC XML-DA driver built on top of base-driver, QuickOPC, and MTConnect .NET SDK libraries.
Perfect for pulling data from Simotion drives running on Simatic Step 7 before OPC-UA was made available.
Handler l99.driver.opcxmlda.handlers.SHDR, opcxmlda outputs data in SHDR format to an MQTT broker and also is available at the TCP port defined in configuration (default: 7878).
Handler l99.driver.opcxmlda.handlers.SplunkMetric, opcxmlda outputs data in Splunk metric format to an MQTT broker.
machines:
- id: demo
enabled: !!bool true
type: l99.driver.opcxmlda.OpcxmldaMachine, opcxmlda
strategy: l99.driver.opcxmlda.collectors.Basic01, opcxmlda
handler: l99.driver.opcxmlda.handlers.SHDR, opcxmldaThe broker section defines the MQTT broker settings.
broker:
enabled: !!bool true
net_ip: 10.20.30.102
net_port: !!int 1883
auto_connect: !!bool true
publish_status: !!bool true
publish_arrivals: !!bool true
publish_changes: !!bool true
publish_disco: !!bool true
disco_base_topic: opcxmldaThe machine type data section identifies individual OPC XML-DA items. The shdr section is specific to the SHDR handler to assist with transmitting the data to an MTConnect Agent.
shdr.name - MTConnect DataItem name
shdr.category - MTConnect DataItem category (sample,event,message,condition)
shdr.eval - Lua evaluation context and pre-processor
l99.driver.opcxmlda.OpcxmldaMachine, opcxmlda:
sweep_ms: !!int 1000
net_uri: http://opcxml.demo-this.com/XmlDaSampleServer/Service.asmx
net_timeout_s: !!int 3
data:
- Dynamic/Analog Types/Double:
shdr:
name: analog_double
category: sample
eval: |
--print(JObject.FromObject(dataitems):ToString());
if current_value == 'UNAVAILABLE' then
print(name .. ' is available')
return new_value
else
print(name .. ' = ' .. current_value .. ' + ' .. new_value)
return current_value + new_value
end
- Dynamic/Analog Types/Int:
shdr:
name: analog_int
category: sample
eval: |
print('analog_int value: ' .. dataitems["analog_int"].Value);
return new_value;
- Dynamic/Analog Types/Double[]:
- Static/Simple Types/String:
shdr:
name: simple_string
category: message
eval: |
random_code = math.random(100,999);
dataitem.Code = tostring(random_code);
return new_value;
- Static/Simple Types/DateTime:
shdr:
name: simple_datetime
category: event
- Static/ArrayTypes/Object[]:
- Dynamic/Analog Types/Fools/Guildenstern:
- Dynamic/Enumerated Types/Gems:
- SomeUnknownItem:Handler sections provide additional configuration. In this case the SHDR handler identifies the MTConnect Adapter to listen on as well as additional MTConnect DataItems that might not be available at the OPC server.
l99.driver.opcxmlda.handlers.SHDR, opcxmlda:
port: !!int 7878
verbose: !!bool true
lua_head: |
luanet.load_assembly 'System';
luanet.load_assembly 'Newtonsoft.Json';
JObject = luanet.import_type 'Newtonsoft.Json.Linq.JObject';
data:
- avail:
shdr:
name: avail
category: event
eval: |
return "AVAILABLE";The Lua script generated from the config.yml file is shown below. A function is defined for every MTConnect DataItem.
this - Lua table
name - DataItem name
current_value - DataItem current value
new_value - new value arriving from OPC server
dataitem - reference to the MTCDataItem object
dataitems - reference to the MTCDataItem collection
luanet.load_assembly 'System';
luanet.load_assembly 'Newtonsoft.Json';
JObject = luanet.import_type 'Newtonsoft.Json.Linq.JObject';
user = {}
function user:avail(this, name, current_value, new_value, dataitem, dataitems)
return \"AVAILABLE\";
end
function user:analog_double(this, name, current_value, new_value, dataitem, dataitems)
--print(JObject.FromObject(dataitems):ToString());
if current_value == 'UNAVAILABLE' then
print(name .. ' is available')
return new_value
else
print(name .. ' = ' .. current_value .. ' + ' .. new_value)
return current_value + new_value
end
end
function user:analog_int(this, name, current_value, new_value, dataitem, dataitems)
print('analog_int value: ' .. dataitems[\"analog_int\"].Value);
return new_value;
end
function user:simple_string(this, name, current_value, new_value, dataitem, dataitems)
random_code = math.random(100,999);
dataitem.Code = tostring(random_code);
return new_value;
end
