From bacb84b7366bf9d6dbb7ece98c93372dea3b9633 Mon Sep 17 00:00:00 2001 From: Eduard Gerlitz Date: Fri, 4 Apr 2025 11:15:37 +0200 Subject: [PATCH] 20250404_111532_ --- EXEC_PRESS_RESET.bat | 15 +++++ EXEC_PRESS_START.bat | 2 +- EXEC_PRESS_STOP.bat | 2 +- RUN_BTN.py | 31 ++++++--- cfg_varlist.csv | 3 +- condaenv.yml | 6 +- doc/UaExpert_cfg.uap | 157 +++++++++++++++++++++++++++++++++++++++++++ doc/opcua_con.txt | 20 ++++++ opcua_connector.py | 39 +---------- 9 files changed, 223 insertions(+), 52 deletions(-) create mode 100644 EXEC_PRESS_RESET.bat create mode 100644 doc/UaExpert_cfg.uap create mode 100644 doc/opcua_con.txt diff --git a/EXEC_PRESS_RESET.bat b/EXEC_PRESS_RESET.bat new file mode 100644 index 0000000..55107db --- /dev/null +++ b/EXEC_PRESS_RESET.bat @@ -0,0 +1,15 @@ +@echo off +setlocal + +:: ---------- USER DEFINE -------------- +set "venvName=opcua_com" +set "scriptPath=RUN_BTN.py" +set "arg=-n BTN_RESET" +:: ------------------------------------- + +:: Activate the Conda environment and execute the Python script +call conda activate %venvName% +python "%scriptPath%" %arg% + +:: Pause at the end of the script +#pause diff --git a/EXEC_PRESS_START.bat b/EXEC_PRESS_START.bat index 07b86ff..008f0bc 100644 --- a/EXEC_PRESS_START.bat +++ b/EXEC_PRESS_START.bat @@ -12,4 +12,4 @@ call conda activate %venvName% python "%scriptPath%" %arg% :: Pause at the end of the script -pause +#pause diff --git a/EXEC_PRESS_STOP.bat b/EXEC_PRESS_STOP.bat index 42f742c..73cd026 100644 --- a/EXEC_PRESS_STOP.bat +++ b/EXEC_PRESS_STOP.bat @@ -12,4 +12,4 @@ call conda activate %venvName% python "%scriptPath%" %arg% :: Pause at the end of the script -pause +#pause diff --git a/RUN_BTN.py b/RUN_BTN.py index 48bc58a..cc2955f 100644 --- a/RUN_BTN.py +++ b/RUN_BTN.py @@ -14,6 +14,7 @@ def check_opcua_server(OPCcon): return 1 # Move to state 1 except Exception as e: print(f"Error connecting to OPC UA server: {e}") + return 99 def establish_connection(OPCcon): """State 1: Establish connection to OPC UA server.""" @@ -21,29 +22,33 @@ def establish_connection(OPCcon): try: if OPCcon.opcuaclient.uaclient: print("OPC UA connection established.") - return 2 # Move to state 2 + return 2 else: print(f"Error establishing connection") + return 99 except Exception as e: print(f"Error establishing connection: {e}") + return 99 def push_btn(OPCcon, btn_name): """State 2:""" print("---- State 2 ----") try: OPCcon.press_btn(btn_name) - print("Data collection complete.") - return 99 # Return to state 2 + print("Press button done.") + return 99 except Exception as e: - print(f"Error in data collection: {e}.") + print(f"Error in Press button: {e}.") + return 99 if __name__ == '__main__': # Argument parsing parser = argparse.ArgumentParser(description='Run OPC UA button press script.') - parser.add_argument('-n', '--name', type=str, choices=['BTN_START', 'BTN_STOP'], required=True, help='Button name to press (BTN_START or BTN_STOP)') + parser.add_argument('-n', '--name', type=str, required=True, help='Button name to press (BTN_START or BTN_STOP)') args = parser.parse_args() btn_name = args.name # Get button name from arguments + # btn_name = 'BTN_STOP' # Get button name from arguments # INIT config = yaml.safe_load(open('./cfg.yaml')) @@ -51,12 +56,16 @@ if __name__ == '__main__': # State machine loop state = 0 - if state == 0: - state = check_opcua_server(OPCcon) - elif state == 1: - state = establish_connection(OPCcon) - elif state == 2: - state = push_btn(OPCcon, btn_name) + active = True + while active: + if state == 0: + state = check_opcua_server(OPCcon) + elif state == 1: + state = establish_connection(OPCcon) + elif state == 2: + state = push_btn(OPCcon, btn_name) + else: + active = False # Close the InfluxDB connection when done OPCcon.influxclient.close() diff --git a/cfg_varlist.csv b/cfg_varlist.csv index c4581c4..75a7b7a 100644 --- a/cfg_varlist.csv +++ b/cfg_varlist.csv @@ -1,2 +1,3 @@ BTN_START ns=2;s=LBP_Chan1.A_NCStart -BTN_STOP ns=2;s=LBP_Chan1.A_NCStop \ No newline at end of file +BTN_STOP ns=2;s=LBP_Chan1.A_NCStop +BTN_RESET ns=2;s=LBP_Chan1.A_Reset \ No newline at end of file diff --git a/condaenv.yml b/condaenv.yml index f77e6e7..f9e2e3a 100644 --- a/condaenv.yml +++ b/condaenv.yml @@ -6,8 +6,10 @@ dependencies: - python=3.10 - opcua - numpy - - pyyaml - cryptography - matplotlib - pandas - - influxdb-client \ No newline at end of file + - influxdb-client + - pip + - pip: + - pyyaml \ No newline at end of file diff --git a/doc/UaExpert_cfg.uap b/doc/UaExpert_cfg.uap new file mode 100644 index 0000000..209ee19 --- /dev/null +++ b/doc/UaExpert_cfg.uap @@ -0,0 +1,157 @@ +[Servers] +0\Name=SinOneA +0\Connected=true +0\ProjectServerId=0 +0\ServerUrl=opc.tcp://192.168.214.1:4840 +0\Server.ApplicationUri= +0\Server.ProductUri= +0\Server.ApplicationNameLocale= +0\Server.ApplicationNameText= +0\Server.ApplicationType=0 +0\Server.GatewayServerUri= +0\Server.DiscoveryProfileUri= +0\Server.NoOfDiscoveryUrls=0 +0\ServerCertificate=@ByteArray() +0\MessageSecurityMode=3 +0\SecurityPolicy=http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256 +0\NoOfUserIdentityTokens=0 +0\TransportProfileUri= +0\SecurityLevel=0 +0\DisplayName=SinOneA +0\ReverseConnect=false +0\ClientEndpointUrl= +0\UserTokenType=1 +0\SessionName=SinOneA +0\DiscoveryHost= +0\UserName=OpcUaClient +0\StorePassword=true +0\CertificateFile= +0\PrivateKeyFile= +0\PkiStoreIndex=0 +0\Namespaces\0=http://opcfoundation.org/UA/ +0\Namespaces\1=urn:ncu1.local:SiemensAG:SinumerikServer +0\Namespaces\2=SinumerikVarProvider + +[Documents] +Data%20Access%20View\DocumentType=Data Access View +Data%20Access%20View\DocumentSettings\headerState="@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x5r\0\0\0\t\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x84\0\0\0\0\0\0\0\t\0\0\0,\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\x1=\0\0\0\x1\0\0\0\0\0\0\0\xa8\0\0\0\x1\0\0\0\0\0\0\x1m\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\xff\xff\xff\xff)" +Data%20Access%20View\DocumentSettings\SubscriptionSettings\publishingInterval=500 +Data%20Access%20View\DocumentSettings\SubscriptionSettings\lifetimeCount=2400 +Data%20Access%20View\DocumentSettings\SubscriptionSettings\maxKeepAliveCount=10 +Data%20Access%20View\DocumentSettings\SubscriptionSettings\maxNotificationsPerPublish=0 +Data%20Access%20View\DocumentSettings\SubscriptionSettings\priority=0 +Data%20Access%20View\DocumentSettings\SubscriptionSettings\publishingEnabled=true +Data%20Access%20View\DocumentSettings\Items\000\003\DisplayName=vaIb +Data%20Access%20View\DocumentSettings\Items\000\003\NodeId="ns=2;s=/Channel/GeometricAxis/vaIb" +Data%20Access%20View\DocumentSettings\Items\000\003\Status=2 +Data%20Access%20View\DocumentSettings\Items\000\003\MonitoringMode=2 +Data%20Access%20View\DocumentSettings\Items\000\003\MonitoringParameters\DiscardOldest=1 +Data%20Access%20View\DocumentSettings\Items\000\003\MonitoringParameters\QueueSize=1 +Data%20Access%20View\DocumentSettings\Items\000\003\MonitoringParameters\SamplingInterval=250 +Data%20Access%20View\DocumentSettings\Items\000\004\DisplayName="vaIm[u1, 1]" +Data%20Access%20View\DocumentSettings\Items\000\004\NodeId="ns=2;s=/Channel/MachineAxis/vaIm[u1, 1]" +Data%20Access%20View\DocumentSettings\Items\000\004\Status=2 +Data%20Access%20View\DocumentSettings\Items\000\004\MonitoringMode=2 +Data%20Access%20View\DocumentSettings\Items\000\004\MonitoringParameters\DiscardOldest=1 +Data%20Access%20View\DocumentSettings\Items\000\004\MonitoringParameters\QueueSize=1 +Data%20Access%20View\DocumentSettings\Items\000\004\MonitoringParameters\SamplingInterval=250 +Data%20Access%20View\DocumentSettings\Items\000\005\DisplayName="vaIm[u1, 2]" +Data%20Access%20View\DocumentSettings\Items\000\005\NodeId="ns=2;s=/Channel/MachineAxis/vaIm[u1, 2]" +Data%20Access%20View\DocumentSettings\Items\000\005\Status=2 +Data%20Access%20View\DocumentSettings\Items\000\005\MonitoringMode=2 +Data%20Access%20View\DocumentSettings\Items\000\005\MonitoringParameters\DiscardOldest=1 +Data%20Access%20View\DocumentSettings\Items\000\005\MonitoringParameters\QueueSize=1 +Data%20Access%20View\DocumentSettings\Items\000\005\MonitoringParameters\SamplingInterval=250 +Data%20Access%20View\DocumentSettings\Items\000\006\DisplayName="vaIb[u2,1]" +Data%20Access%20View\DocumentSettings\Items\000\006\NodeId="ns=2;s=/Channel/GeometricAxis/vaIb[u2,1]" +Data%20Access%20View\DocumentSettings\Items\000\006\Status=2 +Data%20Access%20View\DocumentSettings\Items\000\006\MonitoringMode=2 +Data%20Access%20View\DocumentSettings\Items\000\006\MonitoringParameters\DiscardOldest=1 +Data%20Access%20View\DocumentSettings\Items\000\006\MonitoringParameters\QueueSize=1 +Data%20Access%20View\DocumentSettings\Items\000\006\MonitoringParameters\SamplingInterval=250 +Data%20Access%20View\DocumentSettings\Items\000\007\DisplayName="vaIb[u2,2]" +Data%20Access%20View\DocumentSettings\Items\000\007\NodeId="ns=2;s=/Channel/GeometricAxis/vaIb[u2,2]" +Data%20Access%20View\DocumentSettings\Items\000\007\Status=2 +Data%20Access%20View\DocumentSettings\Items\000\007\MonitoringMode=2 +Data%20Access%20View\DocumentSettings\Items\000\007\MonitoringParameters\DiscardOldest=1 +Data%20Access%20View\DocumentSettings\Items\000\007\MonitoringParameters\QueueSize=1 +Data%20Access%20View\DocumentSettings\Items\000\007\MonitoringParameters\SamplingInterval=250 +Data%20Access%20View\DocumentSettings\Items\000\008\DisplayName="vaIb[u2,3]" +Data%20Access%20View\DocumentSettings\Items\000\008\NodeId="ns=2;s=/Channel/GeometricAxis/vaIb[u2,3]" +Data%20Access%20View\DocumentSettings\Items\000\008\Status=2 +Data%20Access%20View\DocumentSettings\Items\000\008\MonitoringMode=2 +Data%20Access%20View\DocumentSettings\Items\000\008\MonitoringParameters\DiscardOldest=1 +Data%20Access%20View\DocumentSettings\Items\000\008\MonitoringParameters\QueueSize=1 +Data%20Access%20View\DocumentSettings\Items\000\008\MonitoringParameters\SamplingInterval=250 +Data%20Access%20View\DocumentSettings\Items\000\009\DisplayName="vaIb[u2,4]" +Data%20Access%20View\DocumentSettings\Items\000\009\NodeId="ns=2;s=/Channel/GeometricAxis/vaIb[u2,4]" +Data%20Access%20View\DocumentSettings\Items\000\009\Status=2 +Data%20Access%20View\DocumentSettings\Items\000\009\MonitoringMode=2 +Data%20Access%20View\DocumentSettings\Items\000\009\MonitoringParameters\DiscardOldest=1 +Data%20Access%20View\DocumentSettings\Items\000\009\MonitoringParameters\QueueSize=1 +Data%20Access%20View\DocumentSettings\Items\000\009\MonitoringParameters\SamplingInterval=250 +Data%20Access%20View\DocumentSettings\Items\000\010\DisplayName="vaIb[u2,5]" +Data%20Access%20View\DocumentSettings\Items\000\010\NodeId="ns=2;s=/Channel/GeometricAxis/vaIb[u2,5]" +Data%20Access%20View\DocumentSettings\Items\000\010\Status=2 +Data%20Access%20View\DocumentSettings\Items\000\010\MonitoringMode=2 +Data%20Access%20View\DocumentSettings\Items\000\010\MonitoringParameters\DiscardOldest=1 +Data%20Access%20View\DocumentSettings\Items\000\010\MonitoringParameters\QueueSize=1 +Data%20Access%20View\DocumentSettings\Items\000\010\MonitoringParameters\SamplingInterval=250 +Data%20Access%20View\DocumentSettings\Items\000\011\DisplayName="vaIb[u2,6]" +Data%20Access%20View\DocumentSettings\Items\000\011\NodeId="ns=2;s=/Channel/GeometricAxis/vaIb[u2,6]" +Data%20Access%20View\DocumentSettings\Items\000\011\Status=2 +Data%20Access%20View\DocumentSettings\Items\000\011\MonitoringMode=2 +Data%20Access%20View\DocumentSettings\Items\000\011\MonitoringParameters\DiscardOldest=1 +Data%20Access%20View\DocumentSettings\Items\000\011\MonitoringParameters\QueueSize=1 +Data%20Access%20View\DocumentSettings\Items\000\011\MonitoringParameters\SamplingInterval=250 +Data%20Access%20View\DocumentSettings\Items\000\012\DisplayName=vaIb +Data%20Access%20View\DocumentSettings\Items\000\012\NodeId="ns=2;s=/Channel/GeometricAxis/vaIb" +Data%20Access%20View\DocumentSettings\Items\000\012\Status=2 +Data%20Access%20View\DocumentSettings\Items\000\012\MonitoringMode=2 +Data%20Access%20View\DocumentSettings\Items\000\012\MonitoringParameters\DiscardOldest=1 +Data%20Access%20View\DocumentSettings\Items\000\012\MonitoringParameters\QueueSize=1 +Data%20Access%20View\DocumentSettings\Items\000\012\MonitoringParameters\SamplingInterval=250 +Data%20Access%20View\DocumentSettings\Items\000\013\DisplayName=actToolBasePos +Data%20Access%20View\DocumentSettings\Items\000\013\NodeId="ns=2;s=/Channel/GeometricAxis/actToolBasePos" +Data%20Access%20View\DocumentSettings\Items\000\013\Status=2 +Data%20Access%20View\DocumentSettings\Items\000\013\MonitoringMode=2 +Data%20Access%20View\DocumentSettings\Items\000\013\MonitoringParameters\DiscardOldest=1 +Data%20Access%20View\DocumentSettings\Items\000\013\MonitoringParameters\QueueSize=1 +Data%20Access%20View\DocumentSettings\Items\000\013\MonitoringParameters\SamplingInterval=250 +Data%20Access%20View\DocumentSettings\Items\000\014\DisplayName=actProgPos +Data%20Access%20View\DocumentSettings\Items\000\014\NodeId="ns=2;s=/Channel/GeometricAxis/actProgPos" +Data%20Access%20View\DocumentSettings\Items\000\014\Status=2 +Data%20Access%20View\DocumentSettings\Items\000\014\MonitoringMode=2 +Data%20Access%20View\DocumentSettings\Items\000\014\MonitoringParameters\DiscardOldest=1 +Data%20Access%20View\DocumentSettings\Items\000\014\MonitoringParameters\QueueSize=1 +Data%20Access%20View\DocumentSettings\Items\000\014\MonitoringParameters\SamplingInterval=250 +Data%20Access%20View\DocumentSettings\Items\000\017\DisplayName=A_NCStart +Data%20Access%20View\DocumentSettings\Items\000\017\NodeId="ns=2;s=LBP_Chan1.A_NCStart" +Data%20Access%20View\DocumentSettings\Items\000\017\Status=2 +Data%20Access%20View\DocumentSettings\Items\000\017\MonitoringMode=2 +Data%20Access%20View\DocumentSettings\Items\000\017\MonitoringParameters\DiscardOldest=1 +Data%20Access%20View\DocumentSettings\Items\000\017\MonitoringParameters\QueueSize=1 +Data%20Access%20View\DocumentSettings\Items\000\017\MonitoringParameters\SamplingInterval=250 +Data%20Access%20View\DocumentSettings\Items\000\019\DisplayName=A_NCStop +Data%20Access%20View\DocumentSettings\Items\000\019\NodeId="ns=2;s=LBP_Chan1.A_NCStop" +Data%20Access%20View\DocumentSettings\Items\000\019\Status=2 +Data%20Access%20View\DocumentSettings\Items\000\019\MonitoringMode=2 +Data%20Access%20View\DocumentSettings\Items\000\019\MonitoringParameters\DiscardOldest=1 +Data%20Access%20View\DocumentSettings\Items\000\019\MonitoringParameters\QueueSize=1 +Data%20Access%20View\DocumentSettings\Items\000\019\MonitoringParameters\SamplingInterval=250 +Data%20Access%20View\DocumentSettings\Items\000\021\DisplayName=A_Reset +Data%20Access%20View\DocumentSettings\Items\000\021\NodeId="ns=2;s=LBP_Chan1.A_Reset" +Data%20Access%20View\DocumentSettings\Items\000\021\Status=2 +Data%20Access%20View\DocumentSettings\Items\000\021\MonitoringMode=2 +Data%20Access%20View\DocumentSettings\Items\000\021\MonitoringParameters\DiscardOldest=1 +Data%20Access%20View\DocumentSettings\Items\000\021\MonitoringParameters\QueueSize=1 +Data%20Access%20View\DocumentSettings\Items\000\021\MonitoringParameters\SamplingInterval=250 + +[Attribute%20Plugin] +Act_OnOff_Checked=true + +[Reference%20Plugin] +Act_OnOff_Checked=true +Act_ShowHierarchical_Checked=true +Act_ShowNonHierarchical_Checked=true +Cmb_BrowseDirection_State=0 diff --git a/doc/opcua_con.txt b/doc/opcua_con.txt new file mode 100644 index 0000000..12252d7 --- /dev/null +++ b/doc/opcua_con.txt @@ -0,0 +1,20 @@ + CRED +--> OpcUaClient +--> OPCUACLIENT + + + ACTIVATE SERVER @OPERATE +ACTIVATE (256bit,None) +LICENCE +==> COLD RESTART + + + GIVE ALL RIGHTS +Methods/GiveUserAccess +--> OpcUaClient +--> PlcWriteAll + + + + CHECKALL RIGHTS +Methods/GetUserAccessRights \ No newline at end of file diff --git a/opcua_connector.py b/opcua_connector.py index 47d047e..557bb2d 100644 --- a/opcua_connector.py +++ b/opcua_connector.py @@ -25,46 +25,13 @@ class opcua_connector: def press_btn(self, btn_name): var = self.varlist_dict[btn_name] print(var) - # _sent_opcua_data_impuls(self, var) + _sent_opcua_data_impuls(self, var) def read_varlist(self, filename, DELIMITER='\t'): df = pd.read_csv(filename, delimiter=DELIMITER, header=None) return dict(zip(df.iloc[:, 0], df.iloc[:, 1])) - # def track_robot_position(self, SAMPLE_DELAY=0.07, TOTMANN_SEC=3, stop_trigger_node=None, stop_trigger_value=None): - # """Track robot position and check stop trigger from OPC UA client.""" - # try: - # start_time = time() - # write_api = self.influxclient.write_api(write_options=SYNCHRONOUS) - # living_point2 = 0 - # treshold_living = 1 - # - # def RECORDING(): - # fieldnames = self.var_list.values[:, 0].tolist() - # nodes = self.var_list.values[:, 1].tolist() - # val = self.__get_opcua_data(nodes) - # points = [Point("mvalues").field(field, value).time(datetime.datetime.utcnow(), WritePrecision.NS) - # for field, value in zip(fieldnames, val)] - # write_api.write(bucket=self.influx_bucket, org=self.config['cred']["influxdb"]["org"], record=points) - # return val[0] - # - # while TOTMANN_SEC == 0 or time() - start_time < TOTMANN_SEC: - # # Check stop trigger - # stop_trigger_value_current = self.opcuaclient.get_node(stop_trigger_node).get_value() - # if stop_trigger_value_current == stop_trigger_value: - # print("Stop trigger detected.") - # break # Exit the loop when stop trigger is detected - # living_point1 = living_point2 - # living_point2 = RECORDING() - # if abs(living_point1 - living_point2) >= treshold_living: - # start_time = time() # Reset start time to prolong session - # sleep(SAMPLE_DELAY) - # - # except Exception as e: - # print(f"Error during tracking: {e}") - - def _get_opcua_data(self, var_list): """ Retrieve OPC UA node values based on the list of variable nodes. """ return [self.opcuaclient.get_node(var).get_value() for var in var_list] @@ -73,5 +40,5 @@ def _get_opcua_data(self, var_list): def _sent_opcua_data_impuls(self, var): node = self.opcuaclient.get_node(var) node.set_value(1) # Set node to 1 - time.sleep(1) # Wait for 1 second - node.set_value(0) # Set node back to 0 + # time.sleep(1) # Wait for 1 second + # node.set_value(0) # Set node back to 0