def main(): # setup our server server = Server() server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/") # setup our own namespace, not really necessary but should as spec server_namespace = "http://examples.freeopcua.github.io" address_space = server.register_namespace( server_namespace ) # get Objects node, this is where we should put our custom stuff objects_node = server.get_objects_node() # Add the ocp objects (vars, features,...) # cresting the first object my_first_object = objects_node.add_object(address_space, "MyFirstObject") # creating a default event object # The event object automatically will have members for all events properties # you probably want to create a custom event type, see other examples my_first_event_generator = server.get_event_generator() my_first_event_generator.event.Severity = 300 # Creating a custom EVENT eventType = server.create_custom_event_type( address_space, 'ThresholdEvent', ua.ObjectIds.BaseEventType, [ ('value', ua.VariantType.Float), ('alarmEnabled', ua.VariantType.Boolean), ] ) my_custom_event_generator = server.get_event_generator(eventType, my_first_object) # starting! server.start() print( "Server starting ...") rndEv = RandomEventsGenerator(my_first_event_generator) # just a stupide class update a variable rndEv.start() while True: time.sleep(1) sensor_value = random.random() threshold = 0.9 if sensor_value > threshold: my_custom_event_generator.event.Message = ua.LocalizedText("Value is graeter than th") my_custom_event_generator.event.value = ua.Variant(sensor_value, ua.VariantType.Float) my_custom_event_generator.event.alarmenabled = ua.Variant( outputsEnabled , ua.VariantType.Boolean) my_custom_event_generator.event.Severity = ua.Variant( 1 , ua.VariantType.Int32) my_custom_event_generator.trigger()
# setup our own namespace, not really necessary but should as spec uri = "http://examples.freeopcua.github.io" idx = server.register_namespace(uri) # get Objects node, this is where we should put our custom stuff objects = server.get_objects_node() # populating our address space myobj = objects.add_object(idx, "MyObject") myvar = myobj.add_variable(idx, "MyVariable", ua.Variant(0, ua.VariantType.Double)) myvar.set_writable() # Set MyVariable to be writable by clients # Creating a custom event: Approach 1 # The custom event object automatically will have members from its parent (BaseEventType) etype = server.create_custom_event_type(2, 'MyFirstEvent', ua.ObjectIds.BaseEventType, [('MyNumericProperty', ua.VariantType.Float), ('MyStringProperty', ua.VariantType.String)]) # create second event etype2 = server.create_custom_event_type(2, 'MySecondEvent', ua.ObjectIds.BaseEventType, [('MyOtherProperty', ua.VariantType.Float)]) myevgen = server.get_event_generator(etype, myobj) myevgen.event.Severity = 500 myevgen.event.MyStringProperty = ua.Variant("hello world") myevgen2 = server.get_event_generator(etype2, myobj) myevgen2.event.Severity = 123 myevgen2.event.MyOtherProperty = ua.Variant(1.337) serverevgen = server.get_event_generator() serverevgen.event.Severity = 111
server = Server() server.set_endpoint("opc.tcp://127.0.0.1:4840") server.set_server_name("OPCUA-Test") address_space = server.register_namespace("http://andreas-heine.net/UA") root_node = server.get_root_node() object_node = server.get_objects_node() server_node = server.get_server_node() parameter_obj = object_node.add_object(address_space, "Parameter") random_node = parameter_obj.add_variable(address_space, "random", ua.Variant(0, ua.VariantType.UInt64)) etype = server.create_custom_event_type( address_space, 'MyFirstEvent', ua.ObjectIds.BaseEventType, [('MyNumericProperty', ua.VariantType.Float), ('MyStringProperty', ua.VariantType.String)]) myevgen = server.get_event_generator(etype, parameter_obj) vars_obj = object_node.add_object(address_space, "Vars") var_list = [] for i in range(100): var = vars_obj.add_variable( ua.NodeId.from_string(f'ns={address_space};s=DB_DATA.Test.var{i}'), f'Test.var{i}', 0) var.set_writable(True) var_list.append(var) async def servicelevel_updater(servicelevel_node): value = 0
uri = "http://examples.freeopcua.github.io" idx = server.register_namespace(uri) # get Objects node, this is where we should put our custom stuff objects = server.get_objects_node() # populating our address space myobj = objects.add_object(idx, "MyObject") myvar = myobj.add_variable(idx, "MyVariable", ua.Variant(0, ua.VariantType.Double)) myvar.set_writable() # Set MyVariable to be writable by clients # Creating a custom event: Approach 1 # The custom event object automatically will have members from its parent (BaseEventType) etype = server.create_custom_event_type( 2, 'MyFirstEvent', ua.ObjectIds.BaseEventType, [('MyNumericProperty', ua.VariantType.Float), ('MyStringProperty', ua.VariantType.String)]) # create second event etype2 = server.create_custom_event_type( 2, 'MySecondEvent', ua.ObjectIds.BaseEventType, [('MyOtherProperty', ua.VariantType.Float)]) myevgen = server.get_event_generator(etype, myobj) myevgen.event.Severity = 500 myevgen.event.MyStringProperty = ua.Variant("hello world") myevgen2 = server.get_event_generator(etype2, myobj) myevgen2.event.Severity = 123 myevgen2.event.MyOtherProperty = ua.Variant(1.337) serverevgen = server.get_event_generator()
# setup our own namespace, not really necessary but should as spec uri = "http://examples.freeopcua.github.io" idx = server.register_namespace(uri) # get Objects node, this is where we should put our custom stuff objects = server.get_objects_node() # populating our address space myobj = objects.add_object(idx, "MyObject") # Creating a custom event: Approach 1 # The custom event object automatically will have members from its parent (BaseEventType) etype = server.create_custom_event_type( 2, "MyFirstEvent", ua.ObjectIds.BaseEventType, [("MyNumericProperty", ua.VariantType.Float), ("MyStringProperty", ua.VariantType.String)], ) myevgen = server.get_event_generator(etype, myobj) myevgen.event.Severity = 500 # Creating a custom event: Approach 2 base_etype = server.get_node(ua.ObjectIds.BaseEventType) custom_etype = base_etype.add_subtype(2, "MySecondEvent") custom_etype.add_property(2, "MyIntProperty", ua.Variant(None, ua.VariantType.Int32)) custom_etype.add_property(2, "MyBoolProperty", ua.Variant(None, ua.VariantType.Boolean)) mysecondevgen = server.get_event_generator(custom_etype, myobj) # starting!
# setup our own namespace, not really necessary but should as spec uri = "http://examples.freeopcua.github.io" idx = server.register_namespace(uri) # get Objects node, this is where we should put our custom stuff objects = server.get_objects_node() # populating our address space myobj = objects.add_object(idx, "张杰的Object") # Creating a custom event: Approach 1 # The custom event object automatically will have members from its parent (BaseEventType) etype = server.create_custom_event_type( idx, 'MyFirstEvent', ua.ObjectIds.BaseEventType, [('MyNumericProperty', ua.VariantType.Float), ('MyStringProperty', ua.VariantType.String), ('MyByte', ua.VariantType.Byte)]) myevgen = server.get_event_generator(etype, myobj) # Creating a custom event: Approach 2 custom_etype = server.nodes.base_event_type.add_object_type( 2, 'MySecondEvent') custom_etype.add_property(2, 'MyIntProperty', ua.Variant(0, ua.VariantType.Int32)) custom_etype.add_property(2, 'MyBoolProperty', ua.Variant(True, ua.VariantType.Boolean)) mysecondevgen = server.get_event_generator(custom_etype, myobj)
def main(): logging.basicConfig(level=logging.WARN) logger = logging.getLogger("opcua.server.internal_subscription") logger.setLevel(logging.DEBUG) # setup our server server = Server() server.set_endpoint( Commons.OPC_ENDPOINT ) # setup our own namespace, not really necessary but should as spec server_namespace = Commons.OPC_NAMESPACE address_space = server.register_namespace( server_namespace ) # get Objects node, this is where we should put our custom stuff objects_node = server.get_objects_node() # populating our address space ChargeControllerObject = objects_node.add_object(address_space, Commons.MY_OBJECT_NAME) RelayBoxObject = objects_node.add_object(address_space, "RelayBox") panelVoltage = ChargeControllerObject.add_variable( address_space, "panelVoltage", 0.0 ) panelCurrent = ChargeControllerObject.add_variable( address_space, "panelCurrent", 0.0 ) batteryVoltage = ChargeControllerObject.add_variable( address_space, "batteryVoltage", 0.0 ) batteryCurrent = ChargeControllerObject.add_variable( address_space, "batteryCurrent", 0.0 ) loadVoltage = ChargeControllerObject.add_variable( address_space, "loadVoltage", 0.0 ) loadCurrent = ChargeControllerObject.add_variable( address_space, "loadCurrent", 0.0 ) inPower = ChargeControllerObject.add_variable( address_space, "inPower", 0.0 ) outPower = ChargeControllerObject.add_variable( address_space, "outPower", 0.0 ) batteryStatus = ChargeControllerObject.add_variable( address_space, "batteryStatus", "" ) batteryCapacity = ChargeControllerObject.add_variable( address_space, "batteryCapacity", 0.0 ) batteryTemperature = ChargeControllerObject.add_variable( address_space, "batteryTemperature", 0.0 ) ## To make them writable by the clients """ panelVoltage.set_writable() panelCurrent.set_writable() batteryCurrent.set_writable() batteryVoltage.set_writable() loadVoltage.set_writable() loadCurrent.set_writable() inPower.set_writable() outPower.set_writable() batteryStatus.set_writable() batteryCapacity.set_writable() batteryTemperature.set_writable() """ ### Creating a custom EVENT eventType = server.create_custom_event_type( address_space, Commons.MY_FIRST_EVENT_NAME, ua.ObjectIds.BaseEventType, [ ('batteryVoltage', ua.VariantType.Float), ('outputsEnabled', ua.VariantType.Boolean), ] ) myEventGenerator = server.get_event_generator(eventType, ChargeControllerObject) ##creating an array plug_A_current_array = ChargeControllerObject.add_variable(address_space, "plug_A_current_array", [6.7, 7.9]) # the variable could be hard typed plug_B_current_array = ChargeControllerObject.add_variable(address_space, "plug_B_current_array", ua.Variant([], ua.VariantType.Float)) ## creating a property prop_charge_controller_producer = ChargeControllerObject.add_property(address_space, "charge_controller_producer", "Epever") prop_charge_controller_model = ChargeControllerObject.add_property(address_space, "charge_controller_model", "Tracer 2210A MPPT") prop_panel = ChargeControllerObject.add_property(address_space, "panel_info", "12V 100 W") prop_battery = ChargeControllerObject.add_property(address_space, "battery_info", "Bosch 12V") ## Two different methods definitions # First plugs_control_node = RelayBoxObject.add_method(address_space, "set_plug_state", set_plug_state, [ua.VariantType.Boolean], [ua.VariantType.Boolean]) # Second inarg = ua.Argument() inarg.Name = "inverter_state" inarg.DataType = ua.NodeId(ua.ObjectIds.Boolean) inarg.ValueRank = -1 inarg.ArrayDimensions = [] inarg.Description = ua.LocalizedText("Boolean inverter state") outarg = ua.Argument() outarg.Name = "Result" outarg.DataType = ua.NodeId(ua.ObjectIds.Boolean) outarg.ValueRank = -1 outarg.ArrayDimensions = [] outarg.Description = ua.LocalizedText("Final Inverter State") inverter_control_node = RelayBoxObject.add_method(address_space, "set_inverter_state", set_inverter_state, [inarg], [outarg]) # starting! server.start() print( "Server starting ...") # creating my machinery objects chargeController = cc.EpeverChargeController(produce_dummy_data = DUMMY_DATA) outputsEnabled = True try: while True: time.sleep(1) data = chargeController.readAllData() panelVoltage.set_value( data['panelVoltage'] ) panelCurrent.set_value( data['panelCurrent'] ) batteryVoltage.set_value( data['batteryVoltage'] ) batteryCurrent.set_value( data['batteryCurrent'] ) loadVoltage.set_value( data['loadVoltage'] ) loadCurrent.set_value( data['loadCurrent'] ) inPower.set_value( data['inPower'] ) outPower.set_value( data['outPower'] ) batteryStatus.set_value( data['batteryStatus'] ) batteryCapacity.set_value( data['batteryCapacity'] ) batteryTemperature.set_value( data['batteryTemperature'] ) if data['batteryVoltage'] < LOW_BATTERY_VOLTAGE and outputsEnabled: outputsEnabled = False; myEventGenerator.event.Message = ua.LocalizedText("Battery Voltage is too low. Outputs will be disconnected") myEventGenerator.event.batteryVoltage = ua.Variant(float(data['panelVoltage']), ua.VariantType.Float) myEventGenerator.event.outputsEnabled = ua.Variant( outputsEnabled , ua.VariantType.Boolean) myEventGenerator.event.Severity = ua.Variant( 1 , ua.VariantType.Int32) myEventGenerator.trigger() elif data['batteryVoltage'] > LOW_BATTERY_VOLTAGE and not outputsEnabled: outputsEnabled = True; myEventGenerator.event.Message = ua.LocalizedText("Battery Voltage is normal. Outputs will be activated") myEventGenerator.event.batteryVoltage = ua.Variant(float(data['panelVoltage']), ua.VariantType.Float) myEventGenerator.event.outputsEnabled = ua.Variant( outputsEnabled , ua.VariantType.Boolean) myEventGenerator.event.Severity = ua.Variant( 1 , ua.VariantType.Int32) myEventGenerator.trigger() ## update array variables burst = [random.random() for _ in range(1024)] plug_A_current_array.set_value(burst) plug_B_current_array.set_value(burst) embed() finally: # close connection, remove subcsriptions, etc server.stop()