From 0f0d6fd6af21acb61ec1db9af0c0776ea9a99965 Mon Sep 17 00:00:00 2001 From: MRIIOT Date: Sun, 5 Feb 2023 19:05:26 -0600 Subject: [PATCH] * 0.6 release --- base-driver | 2 +- examples/docker/config.machines.yml | 88 ++++++---- examples/docker/config.system.yml | 29 +--- examples/docker/config.user.yml | 57 ++++-- examples/docker/nlog.config | 14 +- examples/windows/config.machines-original.yml | 163 ------------------ examples/windows/config.machines.yml | 105 +++++++---- examples/windows/config.user.yml | 127 ++++++++++++++ examples/windows/nlog.config | 15 +- fanuc/FanucMachine.cs | 24 ++- fanuc/fanuc.csproj | 9 +- fanuc/handlers/FanucOne.cs | 5 + fanuc/platform/Platform.cs | 1 + fanuc/strategies/FanucExtendedStrategy.cs | 1 + fanuc/strategies/FanucMultiStrategy.cs | 15 +- fanuc/transports/InfluxLP.cs | 5 +- fanuc/transports/MQTT.cs | 11 +- fanuc/transports/SHDR.cs | 104 +---------- fanuc/transports/SpB.cs | 2 + fanuc/utils/FocasEndpoint.cs | 2 +- fanuc/utils/GCode.cs | 2 +- fanuc/utils/IntermediateModelGenerator.cs | 2 +- fanuc/utils/JsonFlattenExtensions.cs | 3 +- fanuc/utils/MTCDeviceModelGenerator.cs | 105 +++++++++++ fanuc/utils/Network.cs | 2 +- fanuc/utils/SingleThreadBlockingRunner.cs | 2 +- fanuc/veneers/GCodeBlocks.cs | 2 +- 27 files changed, 496 insertions(+), 401 deletions(-) delete mode 100644 examples/windows/config.machines-original.yml create mode 100644 fanuc/utils/MTCDeviceModelGenerator.cs diff --git a/base-driver b/base-driver index fb6949d..d4fe842 160000 --- a/base-driver +++ b/base-driver @@ -1 +1 @@ -Subproject commit fb6949de7b3266b89a67a9b835a80ccf92727c7a +Subproject commit d4fe842eb03ee98bdea3135cc820f3702994d4cb diff --git a/examples/docker/config.machines.yml b/examples/docker/config.machines.yml index 6aa6d8a..1d2739f 100644 --- a/examples/docker/config.machines.yml +++ b/examples/docker/config.machines.yml @@ -60,12 +60,12 @@ machines: # <<: *no-filter # LONG VERSION - - id: f_sim_mtc_long + - id: f_sim_mqtt_long enabled: !!bool false type: l99.driver.fanuc.FanucMachine, fanuc strategy: l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc handler: l99.driver.fanuc.handlers.FanucOne, fanuc - transport: l99.driver.fanuc.transports.SHDR, fanuc + transport: l99.driver.fanuc.transports.MQTT, fanuc l99.driver.fanuc.FanucMachine, fanuc: sweep_ms: !!int 1000 net: @@ -73,6 +73,11 @@ machines: port: !!int 8193 timeout_s: !!int 3 l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc: + stay_connected: !!bool false + #exclusions: + # 1: + # 2: [ X, S ] + # 3: [ % ] collectors: - l99.driver.fanuc.collectors.MachineInfo, fanuc - l99.driver.fanuc.collectors.Alarms, fanuc @@ -80,27 +85,54 @@ machines: - l99.driver.fanuc.collectors.StateData, fanuc - l99.driver.fanuc.collectors.ToolData, fanuc - l99.driver.fanuc.collectors.ProductionData, fanuc + #- l99.driver.fanuc.collectors.ProductionDataExternalSubprogramDetails, fanuc - l99.driver.fanuc.collectors.GCodeData, fanuc - l99.driver.fanuc.collectors.AxisData, fanuc - l99.driver.fanuc.collectors.SpindleData, fanuc l99.driver.fanuc.handlers.FanucOne, fanuc: - change_only: !!bool false + change_only: !!bool true skip_internal: !!bool true - l99.driver.fanuc.transports.SHDR, fanuc: - << : *default-shdr-transformers - << : *default-shdr-model-genny - device_name: f_sim + l99.driver.fanuc.transports.MQTT, fanuc: + topic: fanuc/{{machine.Id}}/{{veneer.Name}}{{if veneer.SliceKey}}/{{veneer.SliceKey}}{{end}} + enabled: !!bool true net: - port: !!int 7878 - heartbeat_ms: !!int 10000 - interval_ms: !!int 1000 + type: tcp + ip: 127.0.0.1 + port: !!int 1883 + anonymous: !!bool true + user: + password: + l99.driver.fanuc.collectors.ProductionData, fanuc: + unsupported: !!bool false + l99.driver.fanuc.collectors.GCodeData, fanuc: + block_counter: !!bool false + buffer_length: !!int 512 + l99.driver.fanuc.collectors.ProductionDataExternalSubprogramDetails, fanuc: + extraction: + files: + 1: "c:/partprg/one" + 1400: "c:/partprg/MCenter" + 1401: "c:/partprg/PLeft" + 1402: "c:/partprg/PRight" + lines: + count: !!int 60 + show: !!bool false + keep: !!bool false + properties: + keep: !!bool true + map: + program_name: "^\\( *(?PROGRAM NAME) *: *(?[^\\):\\n]+[^ \\):\\n])* *\\)$" + feed: "^\\( *(?FEED) *: *(?[^\\):\\n]+[^ \\):\\n])* *\\)$" + time_per_program: "^\\( *(?TIME/PROGRAM) *: *(?[^\\):\\n]+[^ \\):\\n])* *\\)$" + kits_per_program: "^\\( *(?KITS/PROGRAM) *: *(?[^\\):\\n]+[^ \\):\\n])* *\\)$" + comments: "^\\( *(?COMMENTS) *: *(?[^\\):\\n]+[^ \\):\\n])* *\\)$" - - id: f_sim_mqtt_long + - id: f_sim_mtc_long enabled: !!bool true type: l99.driver.fanuc.FanucMachine, fanuc strategy: l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc handler: l99.driver.fanuc.handlers.FanucOne, fanuc - transport: l99.driver.fanuc.transports.MQTT, fanuc + transport: l99.driver.fanuc.transports.SHDR, fanuc l99.driver.fanuc.FanucMachine, fanuc: sweep_ms: !!int 1000 net: @@ -108,6 +140,7 @@ machines: port: !!int 8193 timeout_s: !!int 3 l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc: + stay_connected: !!bool false collectors: - l99.driver.fanuc.collectors.MachineInfo, fanuc - l99.driver.fanuc.collectors.Alarms, fanuc @@ -119,18 +152,16 @@ machines: - l99.driver.fanuc.collectors.AxisData, fanuc - l99.driver.fanuc.collectors.SpindleData, fanuc l99.driver.fanuc.handlers.FanucOne, fanuc: - change_only: !!bool true + change_only: !!bool false skip_internal: !!bool true - l99.driver.fanuc.transports.MQTT, fanuc: - topic: fanuc/{{machine.Id}}/{{veneer.Name}}{{if veneer.SliceKey}}/{{veneer.SliceKey}}{{end}} - enabled: !!bool true + l99.driver.fanuc.transports.SHDR, fanuc: + << : *default-shdr-transformers + << : *default-shdr-model-genny + device_name: f_sim net: - type: tcp - ip: 10.1.10.173 - port: !!int 1884 - anonymous: !!bool true - user: - password: + port: !!int 7878 + heartbeat_ms: !!int 10000 + interval_ms: !!int 1000 - id: f_sim_spb_long enabled: !!bool false @@ -145,6 +176,7 @@ machines: port: !!int 8193 timeout_s: !!int 3 l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc: + stay_connected: !!bool false collectors: - l99.driver.fanuc.collectors.MachineInfo, fanuc - l99.driver.fanuc.collectors.Alarms, fanuc @@ -155,9 +187,6 @@ machines: - l99.driver.fanuc.collectors.GCodeData, fanuc - l99.driver.fanuc.collectors.AxisData, fanuc - l99.driver.fanuc.collectors.SpindleData, fanuc - l99.driver.fanuc.handlers.FanucOne, fanuc: - change_only: !!bool true - skip_internal: !!bool true l99.driver.fanuc.transports.SpB, fanuc: enabled: !!bool true net: @@ -181,6 +210,7 @@ machines: port: !!int 8193 timeout_s: !!int 3 l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc: + stay_connected: !!bool false collectors: - l99.driver.fanuc.collectors.MachineInfo, fanuc - l99.driver.fanuc.collectors.Alarms, fanuc @@ -191,15 +221,9 @@ machines: - l99.driver.fanuc.collectors.GCodeData, fanuc - l99.driver.fanuc.collectors.AxisData, fanuc - l99.driver.fanuc.collectors.SpindleData, fanuc - l99.driver.fanuc.handlers.FanucOne, fanuc: - change_only: !!bool true - skip_internal: !!bool true l99.driver.fanuc.transports.InfluxLP, fanuc: - l99.driver.fanuc.transports.InfluxLP, fanuc: <<: *default-influx-transformers host: "http://influx:8086" token: "dewlnpy0CmcikwWmMBlqoxcoeuUWpdlDQi8yH7QyGU0tcfn0avMMcpPWYJ-ZUmLD8iHXNl27M3GBHGC4n4_EwA==" org: "fanuc" - bucket: "fanuc" - - \ No newline at end of file + bucket: "fanuc" \ No newline at end of file diff --git a/examples/docker/config.system.yml b/examples/docker/config.system.yml index 3eaf156..c4fa05c 100644 --- a/examples/docker/config.system.yml +++ b/examples/docker/config.system.yml @@ -2,23 +2,6 @@ # system configuration section # system: - machine-disabled: &machine-disabled - enabled: !!bool false - machine-base: &machine-base - enabled: !!bool true - type: l99.driver.fanuc.FanucMachine, fanuc - strategy: l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc - handler: l99.driver.fanuc.handlers.FanucOne, fanuc - change-filter: &change-filter - l99.driver.fanuc.handlers.FanucOne, fanuc: - change_only: !!bool true - skip_internal: !!bool true - no-filter: &no-filter - l99.driver.fanuc.handlers.FanucOne, fanuc: - change_only: !!bool false - skip_internal: !!bool true - default-mqtt-options: &default-mqtt-options - topic: fanuc/{{machine.Id}}/{{veneer.Name}}{{if veneer.SliceKey}}/{{veneer.SliceKey}}{{end}} default-influx-transformers: &default-influx-transformers transformers: SWEEP_END: >- @@ -418,14 +401,4 @@ system: ShdrEventIf p+`_state` (data.speed > 0) `TRAVEL` `STOPPED`; ShdrEvent p+`_rotary` `SPINDLE`; ShdrConditionFaultIf p+`_alm_lnk` (! data.status_lnk); - ShdrConditionSeverity p+`_alm_amp` (data.error > 0) (data.warning > 0) (data.error == 0 && data.warning == 0); - transport-base-null: &transport-base-null - transport: l99.driver.fanuc.transports.Null, fanuc - transport-base-mqtt: &transport-base-mqtt - transport: l99.driver.fanuc.transports.MQTT, fanuc - transport-base-influx: &transport-base-influx - transport: l99.driver.fanuc.transports.InfluxLP, fanuc - transport-base-shdr: &transport-base-shdr - transport: l99.driver.fanuc.transports.SHDR, fanuc - transport-base-spb: &transport-base-spb - transport: l99.driver.fanuc.transports.SpB, fanuc + ShdrConditionSeverity p+`_alm_amp` (data.error > 0) (data.warning > 0) (data.error == 0 && data.warning == 0); \ No newline at end of file diff --git a/examples/docker/config.user.yml b/examples/docker/config.user.yml index 67951da..f25aa67 100644 --- a/examples/docker/config.user.yml +++ b/examples/docker/config.user.yml @@ -2,26 +2,64 @@ # user configuration section # user: - # focas sources + + machine-disabled: &machine-disabled + enabled: !!bool false + machine-base: &machine-base + enabled: !!bool true + type: l99.driver.fanuc.FanucMachine, fanuc + strategy: l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc + handler: l99.driver.fanuc.handlers.FanucOne, fanuc + change-filter: &change-filter + l99.driver.fanuc.handlers.FanucOne, fanuc: + change_only: !!bool true + skip_internal: !!bool true + no-filter: &no-filter + l99.driver.fanuc.handlers.FanucOne, fanuc: + change_only: !!bool false + skip_internal: !!bool true + default-mqtt-options: &default-mqtt-options + topic: fanuc/{{machine.Id}}/{{veneer.Name}}{{if veneer.SliceKey}}/{{veneer.SliceKey}}{{end}} + + transport-base-null: &transport-base-null + transport: l99.driver.fanuc.transports.Null, fanuc + transport-base-mqtt: &transport-base-mqtt + transport: l99.driver.fanuc.transports.MQTT, fanuc + transport-base-influx: &transport-base-influx + transport: l99.driver.fanuc.transports.InfluxLP, fanuc + transport-base-shdr: &transport-base-shdr + transport: l99.driver.fanuc.transports.SHDR, fanuc + transport-base-spb: &transport-base-spb + transport: l99.driver.fanuc.transports.SpB, fanuc + + # sources source-1: &source-1 - # example fanuc source l99.driver.fanuc.FanucMachine, fanuc: sweep_ms: !!int 1000 net: ip: 10.1.10.211 port: !!int 8193 timeout_s: !!int 3 + # collectors collector-0: &collector-0 - # example collector l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc: + stay_connected: !!bool false + #exclusions: + # 1: + # 2: [ X, S ] + # 3: [ % ] collectors: - l99.driver.fanuc.collectors.ParameterDump, fanuc - l99.driver.fanuc.collectors.DiagnosisDump, fanuc - l99.driver.fanuc.collectors.PmcDump, fanuc collector-1: &collector-1 - # example collector l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc: + stay_connected: !!bool false + #exclusions: + # 1: + # 2: [ X, S ] + # 3: [ % ] collectors: - l99.driver.fanuc.collectors.MachineInfo, fanuc - l99.driver.fanuc.collectors.Alarms, fanuc @@ -32,14 +70,13 @@ user: - l99.driver.fanuc.collectors.GCodeData, fanuc - l99.driver.fanuc.collectors.AxisData, fanuc - l99.driver.fanuc.collectors.SpindleData, fanuc - # targets + + # sinks target-null: &target-null - # send to nothing << : *transport-base-null l99.driver.fanuc.transports.Null, fanuc: enabled: !!bool true target-mqtt-1: &target-mqtt-1 - # send to tcp mqtt broker << : *transport-base-mqtt l99.driver.fanuc.transports.MQTT, fanuc: << : *default-mqtt-options @@ -52,7 +89,6 @@ user: user: password: target-mqtt-2: &target-mqtt-2 - # send to websocket mqtt broker << : *transport-base-mqtt l99.driver.fanuc.transports.MQTT, fanuc: << : *default-mqtt-options @@ -65,7 +101,6 @@ user: user: password: target-influx-1: &target-influx-1 - # send to cloud influx instance <<: *transport-base-influx l99.driver.fanuc.transports.InfluxLP, fanuc: <<: *default-influx-transformers @@ -74,7 +109,6 @@ user: org: "fanuc" bucket: "fanuc" target-spb-1: &target-spb-1 - # send to tcp mqtt broker << : *transport-base-spb l99.driver.fanuc.transports.SpB, fanuc: enabled: !!bool true @@ -86,7 +120,6 @@ user: user: admin password: password target-shdr-1: &target-shdr-1 - # open tcp socket for mtconnect agent << : *transport-base-shdr l99.driver.fanuc.transports.SHDR, fanuc: << : *default-shdr-transformers @@ -95,4 +128,4 @@ user: net: port: !!int 7878 heartbeat_ms: !!int 10000 - interval_ms: !!int 1000 + interval_ms: !!int 1000 \ No newline at end of file diff --git a/examples/docker/nlog.config b/examples/docker/nlog.config index b341004..cdcfef6 100644 --- a/examples/docker/nlog.config +++ b/examples/docker/nlog.config @@ -16,10 +16,22 @@ archiveAboveSize="10000000"/> + + + - + + + + + + + + + + \ No newline at end of file diff --git a/examples/windows/config.machines-original.yml b/examples/windows/config.machines-original.yml deleted file mode 100644 index d7a5229..0000000 --- a/examples/windows/config.machines-original.yml +++ /dev/null @@ -1,163 +0,0 @@ -# -# runtime configuration section -# -machines: - - id: f_sim_mtc_long - enabled: !!bool false - type: l99.driver.fanuc.FanucMachine, fanuc - strategy: l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc - handler: l99.driver.fanuc.handlers.FanucOne, fanuc - transport: l99.driver.fanuc.transports.SHDR, fanuc - l99.driver.fanuc.FanucMachine, fanuc: - sweep_ms: !!int 1000 - net: - ip: 10.1.10.211 - port: !!int 8193 - timeout_s: !!int 3 - l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc: - collectors: - - l99.driver.fanuc.collectors.MachineInfo, fanuc - - l99.driver.fanuc.collectors.Alarms, fanuc - - l99.driver.fanuc.collectors.Messages, fanuc - - l99.driver.fanuc.collectors.StateData, fanuc - - l99.driver.fanuc.collectors.ToolData, fanuc - - l99.driver.fanuc.collectors.ProductionData, fanuc - - l99.driver.fanuc.collectors.GCodeData, fanuc - - l99.driver.fanuc.collectors.AxisData, fanuc - - l99.driver.fanuc.collectors.SpindleData, fanuc - l99.driver.fanuc.handlers.FanucOne, fanuc: - change_only: !!bool false - skip_internal: !!bool true - l99.driver.fanuc.transports.SHDR, fanuc: - << : *default-shdr-transformers - << : *default-shdr-model-genny - device_name: f_sim - net: - port: !!int 7878 - heartbeat_ms: !!int 10000 - interval_ms: !!int 1000 - - - id: f_sim_mqtt_long - enabled: !!bool true - type: l99.driver.fanuc.FanucMachine, fanuc - strategy: l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc - handler: l99.driver.fanuc.handlers.FanucOne, fanuc - transport: l99.driver.fanuc.transports.MQTT, fanuc - l99.driver.fanuc.FanucMachine, fanuc: - sweep_ms: !!int 1000 - net: - ip: 10.1.10.211 - port: !!int 8193 - timeout_s: !!int 3 - l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc: - exclusions: - 1: - 2: [ X, S ] - 3: [ % ] - collectors: - - l99.driver.fanuc.collectors.MachineInfo, fanuc - - l99.driver.fanuc.collectors.Alarms, fanuc - #- l99.driver.fanuc.collectors.Messages, fanuc - - l99.driver.fanuc.collectors.StateData, fanuc - - l99.driver.fanuc.collectors.ToolData, fanuc - #- l99.driver.fanuc.collectors.ProductionData, fanuc - - l99.driver.fanuc.collectors.ProductionDataExternalSubprogramDetails, fanuc - #- l99.driver.fanuc.collectors.GCodeData, fanuc - #- l99.driver.fanuc.collectors.AxisData, fanuc - #- l99.driver.fanuc.collectors.SpindleData, fanuc - l99.driver.fanuc.handlers.FanucOne, fanuc: - change_only: !!bool true - skip_internal: !!bool true - l99.driver.fanuc.transports.MQTT, fanuc: - topic: fanuc/{{machine.Id}}/{{veneer.Name}}{{if veneer.SliceKey}}/{{veneer.SliceKey}}{{end}} - enabled: !!bool true - net: - type: tcp - ip: 127.0.0.1 - port: !!int 1883 - anonymous: !!bool true - user: - password: - l99.driver.fanuc.collectors.ProductionData, fanuc: - unsupported: !!bool true - l99.driver.fanuc.collectors.GCodeData, fanuc: - block_counter: !!bool false - buffer_length: !!int 512 - l99.driver.fanuc.collectors.ProductionDataExternalSubprogramDetails, fanuc: - map: - 1: "c:/partprg/one" - 1400: "c:/partprg/MCenter" - 1401: "c:/partprg/PLeft" - 1402: "c:/partprg/PRight" - lines: !!int 60 - extract: "^\\( *(?[^\\):\\n]+[^ \\):\\n]) *: *(?[^\\):\\n]+[^ \\):\\n])* *\\)$" - - - id: f_sim_spb_long - enabled: !!bool false - type: l99.driver.fanuc.FanucMachine, fanuc - strategy: l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc - handler: l99.driver.fanuc.handlers.FanucOne, fanuc - transport: l99.driver.fanuc.transports.SpB, fanuc - l99.driver.fanuc.FanucMachine, fanuc: - sweep_ms: !!int 1000 - net: - ip: 10.1.10.211 - port: !!int 8193 - timeout_s: !!int 3 - l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc: - collectors: - - l99.driver.fanuc.collectors.MachineInfo, fanuc - - l99.driver.fanuc.collectors.Alarms, fanuc - - l99.driver.fanuc.collectors.Messages, fanuc - - l99.driver.fanuc.collectors.StateData, fanuc - - l99.driver.fanuc.collectors.ToolData, fanuc - - l99.driver.fanuc.collectors.ProductionData, fanuc - - l99.driver.fanuc.collectors.GCodeData, fanuc - - l99.driver.fanuc.collectors.AxisData, fanuc - - l99.driver.fanuc.collectors.SpindleData, fanuc - l99.driver.fanuc.handlers.FanucOne, fanuc: - change_only: !!bool true - skip_internal: !!bool true - l99.driver.fanuc.transports.SpB, fanuc: - enabled: !!bool true - net: - type: tcp - ip: 10.1.10.2 - port: !!int 1883 - anonymous: !!bool false - user: admin - password: password - - - id: f_sim_influx_long - enabled: !!bool false - type: l99.driver.fanuc.FanucMachine, fanuc - strategy: l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc - handler: l99.driver.fanuc.handlers.FanucOne, fanuc - transport: l99.driver.fanuc.transports.InfluxLP, fanuc - l99.driver.fanuc.FanucMachine, fanuc: - sweep_ms: !!int 1000 - net: - ip: 10.1.10.211 - port: !!int 8193 - timeout_s: !!int 3 - l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc: - collectors: - - l99.driver.fanuc.collectors.MachineInfo, fanuc - - l99.driver.fanuc.collectors.Alarms, fanuc - - l99.driver.fanuc.collectors.Messages, fanuc - - l99.driver.fanuc.collectors.StateData, fanuc - - l99.driver.fanuc.collectors.ToolData, fanuc - - l99.driver.fanuc.collectors.ProductionData, fanuc - - l99.driver.fanuc.collectors.GCodeData, fanuc - - l99.driver.fanuc.collectors.AxisData, fanuc - - l99.driver.fanuc.collectors.SpindleData, fanuc - l99.driver.fanuc.handlers.FanucOne, fanuc: - change_only: !!bool true - skip_internal: !!bool true - l99.driver.fanuc.transports.InfluxLP, fanuc: - l99.driver.fanuc.transports.InfluxLP, fanuc: - <<: *default-influx-transformers - host: "http://influx:8086" - token: "dewlnpy0CmcikwWmMBlqoxcoeuUWpdlDQi8yH7QyGU0tcfn0avMMcpPWYJ-ZUmLD8iHXNl27M3GBHGC4n4_EwA==" - org: "fanuc" - bucket: "fanuc" diff --git a/examples/windows/config.machines.yml b/examples/windows/config.machines.yml index 1820647..1d2739f 100644 --- a/examples/windows/config.machines.yml +++ b/examples/windows/config.machines.yml @@ -2,8 +2,66 @@ # runtime configuration section # machines: + # SHORT VERSION + # each machine must have a unique 'id' value + # each machine must consist of the following references: + # base: driver configuration + # *machine-base + # disabled override: (optional) set machine inactive + # *machine-disabled + # source: where to get data + # -- user defined reference + # collector: what data to collect + # -- user defined reference + # target: where to send data + # -- user defined reference + # filter: how to filter data + # *change-filter - send only when data changes + # *no-filter - send all data, regardless of change + + #- id: example-null + # <<: *machine-base + # <<: *machine-disabled + # <<: *source-1 + # <<: *collector-1 + # <<: *target-null + # <<: *change-filter + + #- id: example-mqtt + # <<: *machine-base # base Fanuc configuration + # <<: *machine-disabled # omit this machine setup from runtime; remove to make active + # <<: *source-1 # where to get data + # <<: *collector-1 # what data to get and how to transform data + # <<: *target-mqtt-1 # where to send data + # <<: *change-filter # data filter + + #- id: example-influx + # <<: *machine-base + # <<: *machine-disabled + # <<: *source-1 + # <<: *collector-1 + # <<: *target-influx-1 + # <<: *change-filter + + #- id: example-spb + # <<: *machine-base + # <<: *machine-disabled + # <<: *source-1 + # <<: *collector-1 + # <<: *target-spb-1 + # <<: *change-filter + + #- id: f_sim_mtc_short + # <<: *machine-base + # <<: *machine-disabled + # <<: *source-1 + # <<: *collector-1 + # <<: *target-shdr-1 + # <<: *no-filter + + # LONG VERSION - id: f_sim_mqtt_long - enabled: !!bool true + enabled: !!bool false type: l99.driver.fanuc.FanucMachine, fanuc strategy: l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc handler: l99.driver.fanuc.handlers.FanucOne, fanuc @@ -15,7 +73,7 @@ machines: port: !!int 8193 timeout_s: !!int 3 l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc: - stay_connected: !!bool true + stay_connected: !!bool false #exclusions: # 1: # 2: [ X, S ] @@ -26,8 +84,8 @@ machines: - l99.driver.fanuc.collectors.Messages, fanuc - l99.driver.fanuc.collectors.StateData, fanuc - l99.driver.fanuc.collectors.ToolData, fanuc - #- l99.driver.fanuc.collectors.ProductionData, fanuc - - l99.driver.fanuc.collectors.ProductionDataExternalSubprogramDetails, fanuc + - l99.driver.fanuc.collectors.ProductionData, fanuc + #- l99.driver.fanuc.collectors.ProductionDataExternalSubprogramDetails, fanuc - l99.driver.fanuc.collectors.GCodeData, fanuc - l99.driver.fanuc.collectors.AxisData, fanuc - l99.driver.fanuc.collectors.SpindleData, fanuc @@ -45,7 +103,7 @@ machines: user: password: l99.driver.fanuc.collectors.ProductionData, fanuc: - unsupported: !!bool true + unsupported: !!bool false l99.driver.fanuc.collectors.GCodeData, fanuc: block_counter: !!bool false buffer_length: !!int 512 @@ -70,7 +128,7 @@ machines: comments: "^\\( *(?COMMENTS) *: *(?[^\\):\\n]+[^ \\):\\n])* *\\)$" - id: f_sim_mtc_long - enabled: !!bool false + enabled: !!bool true type: l99.driver.fanuc.FanucMachine, fanuc strategy: l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc handler: l99.driver.fanuc.handlers.FanucOne, fanuc @@ -83,20 +141,16 @@ machines: timeout_s: !!int 3 l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc: stay_connected: !!bool false - #exclusions: - # 1: - # 2: [ X, S ] - # 3: [ % ] collectors: - #- l99.driver.fanuc.collectors.MachineInfo, fanuc - #- l99.driver.fanuc.collectors.Alarms, fanuc - #- l99.driver.fanuc.collectors.Messages, fanuc - #- l99.driver.fanuc.collectors.StateData, fanuc - #- l99.driver.fanuc.collectors.ToolData, fanuc + - l99.driver.fanuc.collectors.MachineInfo, fanuc + - l99.driver.fanuc.collectors.Alarms, fanuc + - l99.driver.fanuc.collectors.Messages, fanuc + - l99.driver.fanuc.collectors.StateData, fanuc + - l99.driver.fanuc.collectors.ToolData, fanuc - l99.driver.fanuc.collectors.ProductionData, fanuc - #- l99.driver.fanuc.collectors.GCodeData, fanuc - #- l99.driver.fanuc.collectors.AxisData, fanuc - #- l99.driver.fanuc.collectors.SpindleData, fanuc + - l99.driver.fanuc.collectors.GCodeData, fanuc + - l99.driver.fanuc.collectors.AxisData, fanuc + - l99.driver.fanuc.collectors.SpindleData, fanuc l99.driver.fanuc.handlers.FanucOne, fanuc: change_only: !!bool false skip_internal: !!bool true @@ -123,10 +177,6 @@ machines: timeout_s: !!int 3 l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc: stay_connected: !!bool false - #exclusions: - # 1: - # 2: [ X, S ] - # 3: [ % ] collectors: - l99.driver.fanuc.collectors.MachineInfo, fanuc - l99.driver.fanuc.collectors.Alarms, fanuc @@ -137,9 +187,6 @@ machines: - l99.driver.fanuc.collectors.GCodeData, fanuc - l99.driver.fanuc.collectors.AxisData, fanuc - l99.driver.fanuc.collectors.SpindleData, fanuc - l99.driver.fanuc.handlers.FanucOne, fanuc: - change_only: !!bool true - skip_internal: !!bool true l99.driver.fanuc.transports.SpB, fanuc: enabled: !!bool true net: @@ -164,10 +211,6 @@ machines: timeout_s: !!int 3 l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc: stay_connected: !!bool false - #exclusions: - # 1: - # 2: [ X, S ] - # 3: [ % ] collectors: - l99.driver.fanuc.collectors.MachineInfo, fanuc - l99.driver.fanuc.collectors.Alarms, fanuc @@ -178,11 +221,7 @@ machines: - l99.driver.fanuc.collectors.GCodeData, fanuc - l99.driver.fanuc.collectors.AxisData, fanuc - l99.driver.fanuc.collectors.SpindleData, fanuc - l99.driver.fanuc.handlers.FanucOne, fanuc: - change_only: !!bool true - skip_internal: !!bool true l99.driver.fanuc.transports.InfluxLP, fanuc: - l99.driver.fanuc.transports.InfluxLP, fanuc: <<: *default-influx-transformers host: "http://influx:8086" token: "dewlnpy0CmcikwWmMBlqoxcoeuUWpdlDQi8yH7QyGU0tcfn0avMMcpPWYJ-ZUmLD8iHXNl27M3GBHGC4n4_EwA==" diff --git a/examples/windows/config.user.yml b/examples/windows/config.user.yml index 9e1269e..89c46f7 100644 --- a/examples/windows/config.user.yml +++ b/examples/windows/config.user.yml @@ -2,3 +2,130 @@ # user configuration section # user: + + machine-disabled: &machine-disabled + enabled: !!bool false + machine-base: &machine-base + enabled: !!bool true + type: l99.driver.fanuc.FanucMachine, fanuc + strategy: l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc + handler: l99.driver.fanuc.handlers.FanucOne, fanuc + change-filter: &change-filter + l99.driver.fanuc.handlers.FanucOne, fanuc: + change_only: !!bool true + skip_internal: !!bool true + no-filter: &no-filter + l99.driver.fanuc.handlers.FanucOne, fanuc: + change_only: !!bool false + skip_internal: !!bool true + default-mqtt-options: &default-mqtt-options + topic: fanuc/{{machine.Id}}/{{veneer.Name}}{{if veneer.SliceKey}}/{{veneer.SliceKey}}{{end}} + + transport-base-null: &transport-base-null + transport: l99.driver.fanuc.transports.Null, fanuc + transport-base-mqtt: &transport-base-mqtt + transport: l99.driver.fanuc.transports.MQTT, fanuc + transport-base-influx: &transport-base-influx + transport: l99.driver.fanuc.transports.InfluxLP, fanuc + transport-base-shdr: &transport-base-shdr + transport: l99.driver.fanuc.transports.SHDR, fanuc + transport-base-spb: &transport-base-spb + transport: l99.driver.fanuc.transports.SpB, fanuc + + # sources + source-1: &source-1 + l99.driver.fanuc.FanucMachine, fanuc: + sweep_ms: !!int 1000 + net: + ip: 10.1.10.211 + port: !!int 8193 + timeout_s: !!int 3 + + # collectors + collector-0: &collector-0 + l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc: + stay_connected: !!bool false + #exclusions: + # 1: + # 2: [ X, S ] + # 3: [ % ] + collectors: + - l99.driver.fanuc.collectors.ParameterDump, fanuc + - l99.driver.fanuc.collectors.DiagnosisDump, fanuc + - l99.driver.fanuc.collectors.PmcDump, fanuc + collector-1: &collector-1 + l99.driver.fanuc.strategies.FanucMultiStrategy, fanuc: + stay_connected: !!bool false + #exclusions: + # 1: + # 2: [ X, S ] + # 3: [ % ] + collectors: + - l99.driver.fanuc.collectors.MachineInfo, fanuc + - l99.driver.fanuc.collectors.Alarms, fanuc + - l99.driver.fanuc.collectors.Messages, fanuc + - l99.driver.fanuc.collectors.StateData, fanuc + - l99.driver.fanuc.collectors.ToolData, fanuc + - l99.driver.fanuc.collectors.ProductionData, fanuc + - l99.driver.fanuc.collectors.GCodeData, fanuc + - l99.driver.fanuc.collectors.AxisData, fanuc + - l99.driver.fanuc.collectors.SpindleData, fanuc + + # sinks + target-null: &target-null + << : *transport-base-null + l99.driver.fanuc.transports.Null, fanuc: + enabled: !!bool true + target-mqtt-1: &target-mqtt-1 + << : *transport-base-mqtt + l99.driver.fanuc.transports.MQTT, fanuc: + << : *default-mqtt-options + enabled: !!bool true + net: + type: tcp + ip: localhost + port: !!int 1883 + anonymous: !!bool true + user: + password: + target-mqtt-2: &target-mqtt-2 + << : *transport-base-mqtt + l99.driver.fanuc.transports.MQTT, fanuc: + << : *default-mqtt-options + enabled: !!bool true + net: + type: ws + ip: test.mosquitto.org + port: !!int 8080 + anonymous: !!bool true + user: + password: + target-influx-1: &target-influx-1 + <<: *transport-base-influx + l99.driver.fanuc.transports.InfluxLP, fanuc: + <<: *default-influx-transformers + host: "http://influx:8086" + token: "dewlnpy0CmcikwWmMBlqoxcoeuUWpdlDQi8yH7QyGU0tcfn0avMMcpPWYJ-ZUmLD8iHXNl27M3GBHGC4n4_EwA==" + org: "fanuc" + bucket: "fanuc" + target-spb-1: &target-spb-1 + << : *transport-base-spb + l99.driver.fanuc.transports.SpB, fanuc: + enabled: !!bool true + net: + type: tcp + ip: 10.1.10.2 + port: !!int 1883 + anonymous: !!bool false + user: admin + password: password + target-shdr-1: &target-shdr-1 + << : *transport-base-shdr + l99.driver.fanuc.transports.SHDR, fanuc: + << : *default-shdr-transformers + << : *default-shdr-model-genny + device_name: f_sim + net: + port: !!int 7878 + heartbeat_ms: !!int 10000 + interval_ms: !!int 1000 diff --git a/examples/windows/nlog.config b/examples/windows/nlog.config index d589cfa..acc4d8c 100644 --- a/examples/windows/nlog.config +++ b/examples/windows/nlog.config @@ -16,11 +16,22 @@ archiveAboveSize="10000000" /> + + + - - + + + + + + + + + + \ No newline at end of file diff --git a/fanuc/FanucMachine.cs b/fanuc/FanucMachine.cs index 2157d82..01ca989 100644 --- a/fanuc/FanucMachine.cs +++ b/fanuc/FanucMachine.cs @@ -1,4 +1,5 @@ using l99.driver.@base; +using l99.driver.fanuc.utils; // ReSharper disable once CheckNamespace namespace l99.driver.fanuc; @@ -8,9 +9,30 @@ public class FanucMachine : Machine { public FanucMachine(Machines machines, object configuration) : base(machines, configuration) { + if (!Configuration.type.ContainsKey("sweep_ms")) + Configuration.type.Add("sweep_ms", 1000); + + if (!Configuration.type.ContainsKey("net")) + { + Configuration.type.Add("net", new Dictionary() + { + { "ip", "127.0.0.1" }, + { "port", 8193 }, + { "timeout_s", 3 } + }); + } + else if (Configuration.type["net"] == null) + { + Configuration.type["net"] = new Dictionary() + { + { "ip", "127.0.0.1" }, + { "port", 8193 }, + { "timeout_s", 3 } + }; + } + this["platform"] = new Platform(this); - //TODO: validate config FocasEndpoint = new FocasEndpoint( Configuration.type["net"]["ip"], (ushort) Configuration.type["net"]["port"], diff --git a/fanuc/fanuc.csproj b/fanuc/fanuc.csproj index ed8a97d..aaf9f90 100644 --- a/fanuc/fanuc.csproj +++ b/fanuc/fanuc.csproj @@ -6,9 +6,9 @@ Debug;Release;Debug 32bit;Release 32 bit AnyCPU Linux - mriiot + MRIIOT LLC - 0.5.5.0 + 0.6.0.0 en fanuc-driver fanuc-driver @@ -17,6 +17,7 @@ https://mriiot.com 10 enable + fanuc-driver @@ -34,12 +35,12 @@ - + - + diff --git a/fanuc/handlers/FanucOne.cs b/fanuc/handlers/FanucOne.cs index 56f26bd..d323109 100644 --- a/fanuc/handlers/FanucOne.cs +++ b/fanuc/handlers/FanucOne.cs @@ -8,6 +8,11 @@ public class FanucOne : Handler { public FanucOne(Machine machine) : base(machine) { + if (!machine.Configuration.handler.ContainsKey("change_only")) + machine.Configuration.handler.Add("change_only", true); + + if (!machine.Configuration.handler.ContainsKey("skip_internal")) + machine.Configuration.handler.Add("skip_internal", true); } protected override async Task OnDataArrivalAsync(Veneers veneers, Veneer veneer, dynamic? beforeArrival) diff --git a/fanuc/platform/Platform.cs b/fanuc/platform/Platform.cs index dc0dfb5..b0ff3c5 100644 --- a/fanuc/platform/Platform.cs +++ b/fanuc/platform/Platform.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using l99.driver.fanuc.utils; // ReSharper disable once CheckNamespace namespace l99.driver.fanuc; diff --git a/fanuc/strategies/FanucExtendedStrategy.cs b/fanuc/strategies/FanucExtendedStrategy.cs index 13c965c..b11fcb4 100644 --- a/fanuc/strategies/FanucExtendedStrategy.cs +++ b/fanuc/strategies/FanucExtendedStrategy.cs @@ -1,5 +1,6 @@ using System.Diagnostics; using l99.driver.@base; +using l99.driver.fanuc.utils; using l99.driver.fanuc.veneers; // ReSharper disable once CheckNamespace diff --git a/fanuc/strategies/FanucMultiStrategy.cs b/fanuc/strategies/FanucMultiStrategy.cs index 9878209..a9d08a0 100644 --- a/fanuc/strategies/FanucMultiStrategy.cs +++ b/fanuc/strategies/FanucMultiStrategy.cs @@ -12,26 +12,23 @@ public class FanucMultiStrategy : FanucExtendedStrategy private Dictionary _exclusions = new(); public FanucMultiStrategy(Machine machine) : base(machine) - { - } - - public override async Task CreateAsync() { if (!Machine.Configuration.strategy.ContainsKey("stay_connected")) - { Machine.Configuration.strategy.Add("stay_connected", false); - } - + if (!Machine.Configuration.strategy.ContainsKey("exclusions")) Machine.Configuration.strategy.Add("exclusions", new Dictionary()); else if (Machine.Configuration.strategy["exclusions"] == null) Machine.Configuration.strategy["exclusions"] = new Dictionary(); - _exclusions = Machine.Configuration.strategy["exclusions"]; - if (!Machine.Configuration.strategy.ContainsKey("collectors")) Machine.Configuration.strategy.Add("collectors", new List()); + } + public override async Task CreateAsync() + { + _exclusions = Machine.Configuration.strategy["exclusions"]; + foreach (var collectorType in Machine.Configuration.strategy["collectors"]) { Logger.Info($"[{Machine.Id}] Creating collector: {collectorType}"); diff --git a/fanuc/transports/InfluxLP.cs b/fanuc/transports/InfluxLP.cs index 7c702f1..70b7d9f 100644 --- a/fanuc/transports/InfluxLP.cs +++ b/fanuc/transports/InfluxLP.cs @@ -21,12 +21,15 @@ public class InfluxLP : Transport public InfluxLP(Machine machine) : base(machine) { + //TODO: make defaults } public override async Task CreateAsync() { _client = InfluxDBClientFactory - .Create(Machine.Configuration.transport["host"], Machine.Configuration.transport["token"]); + .Create( + Machine.Configuration.transport["host"], + Machine.Configuration.transport["token"]); _writeApi = _client.GetWriteApiAsync(); diff --git a/fanuc/transports/MQTT.cs b/fanuc/transports/MQTT.cs index 4536db7..9ce5fd3 100644 --- a/fanuc/transports/MQTT.cs +++ b/fanuc/transports/MQTT.cs @@ -22,14 +22,13 @@ public class MQTT : Transport public MQTT(Machine machine) : base(machine) { + //TODO: make defaults } public override async Task CreateAsync() { - //TODO: validate config _topicTemplate = Template.Parse(Machine.Configuration.transport["topic"]); - _key = - $"{Machine.Configuration.transport["net"]["type"]}://{Machine.Configuration.transport["net"]["ip"]}:{Machine.Configuration.transport["net"]["port"]}/{Machine.Id}"; + _key = $"{Machine.Configuration.transport["net"]["type"]}://{Machine.Configuration.transport["net"]["ip"]}:{Machine.Configuration.transport["net"]["port"]}/{Machine.Id}"; var factory = new MqttFactory(); MqttClientOptionsBuilder builder; @@ -43,7 +42,8 @@ public MQTT(Machine machine) : base(machine) break; default: builder = new MqttClientOptionsBuilder() - .WithTcpServer(Machine.Configuration.transport["net"]["ip"], + .WithTcpServer( + Machine.Configuration.transport["net"]["ip"], Machine.Configuration.transport["net"]["port"]); break; } @@ -101,8 +101,7 @@ public override async Task SendAsync(params dynamic[] parameters) if (_client.IsConnected) { - Logger.Trace( - $"{new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds()} PUB {payload.Length}b => {topic}\n{payload}"); + Logger.Trace($"{new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds()} PUB {payload.Length}b => {topic}\n{payload}"); var msg = new MqttApplicationMessageBuilder() .WithRetainFlag(retained) diff --git a/fanuc/transports/SHDR.cs b/fanuc/transports/SHDR.cs index 583f5c8..cbae23e 100644 --- a/fanuc/transports/SHDR.cs +++ b/fanuc/transports/SHDR.cs @@ -1,6 +1,5 @@ -using System.Diagnostics.CodeAnalysis; -using System.IO; -using l99.driver.@base; +using l99.driver.@base; +using l99.driver.fanuc.utils; using MTConnect.Adapters.Shdr; using MTConnect.Observations; using MTConnect.Shdr; @@ -10,104 +9,6 @@ // ReSharper disable once CheckNamespace namespace l99.driver.fanuc.transports; -// ReSharper disable once InconsistentNaming -public class MTCDeviceModelGenerator -{ - private readonly ILogger _logger; - private readonly Machine _machine; - private readonly dynamic _transport; - - public MTCDeviceModelGenerator(Machine machine, dynamic transport) - { - _logger = LogManager.GetLogger(GetType().FullName); - _machine = machine; - _transport = transport; - } - - public void Generate(dynamic model) - { - if (!_transport["generator"]["enabled"]) - return; - - try - { - var generator = _transport["generator"]; - - Template tp = null!; - var so = new ScriptObject(); - var tc = new TemplateContext(); - - var paths = model.structure.Keys; - - var axes = new Dictionary>(); - var spindles = new Dictionary>(); - - foreach (var path in model.structure.Keys) - { - axes.Add(path, model.structure[path].Item1); - spindles.Add(path, model.structure[path].Item2); - } - - so.Import("GenerateAxis", - new Func((section, path, axis) => - { - so.SetValue("path", path, true); - so.SetValue("axis", axis, true); - so.SetValue("spindle", null, true); - tp = Template.Parse(section); - var x = tp.Render(tc); - so.SetValue("path", null, true); - so.SetValue("axis", null, true); - return x; - })); - - so.Import("GenerateSpindle", - new Func((section, path, spindle) => - { - so.SetValue("path", path, true); - so.SetValue("axis", null, true); - so.SetValue("spindle", spindle, true); - tp = Template.Parse(section); - var x = tp.Render(tc); - so.SetValue("path", null, true); - so.SetValue("spindle", null, true); - return x; - })); - - so.Import("GeneratePath", - new Func((section, path) => - { - so.SetValue("path", path, true); - so.SetValue("axis", null, true); - so.SetValue("spindle", null, true); - tp = Template.Parse(section); - var x = tp.Render(tc); - so.SetValue("path", null, true); - return x; - })); - - tc.PushGlobal(so); - - so.SetValue("generator", generator, true); - so.SetValue("device", _transport["device_name"], true); - so.SetValue("paths", paths, true); - so.SetValue("axes", axes, true); - so.SetValue("spindles", spindles, true); - tp = Template.Parse(generator["root"]); - var xml = tp.Render(tc); - - tp = Template.Parse(generator["output"]); - var fileOut = tp.Render(tc); - - File.WriteAllText(fileOut, xml); - } - catch (Exception ex) - { - _logger.Error(ex, $"[{_machine.Id} MTC device model generation failed!"); - } - } -} - // ReSharper disable once InconsistentNaming // ReSharper disable once UnusedType.Global public class SHDR : Transport @@ -129,6 +30,7 @@ public class SHDR : Transport public SHDR(Machine machine) : base(machine) { + //TODO: make defaults } private bool ShdrInvalidated diff --git a/fanuc/transports/SpB.cs b/fanuc/transports/SpB.cs index 40cb899..0f5454d 100644 --- a/fanuc/transports/SpB.cs +++ b/fanuc/transports/SpB.cs @@ -1,4 +1,5 @@ using l99.driver.@base; +using l99.driver.fanuc.utils; using SparkplugNet.Core.Node; using SparkplugNet.VersionB; using SparkplugNet.VersionB.Data; @@ -21,6 +22,7 @@ public class SpB : Transport public SpB(Machine machine) : base(machine) { + //TODO: make defaults } public override async Task CreateAsync() diff --git a/fanuc/utils/FocasEndpoint.cs b/fanuc/utils/FocasEndpoint.cs index 4827d3b..8234a27 100644 --- a/fanuc/utils/FocasEndpoint.cs +++ b/fanuc/utils/FocasEndpoint.cs @@ -1,5 +1,5 @@ // ReSharper disable once CheckNamespace -namespace l99.driver.fanuc; +namespace l99.driver.fanuc.utils; public class FocasEndpoint { diff --git a/fanuc/utils/GCode.cs b/fanuc/utils/GCode.cs index 40903b1..7667220 100644 --- a/fanuc/utils/GCode.cs +++ b/fanuc/utils/GCode.cs @@ -1,6 +1,6 @@ // ReSharper disable once CheckNamespace -namespace l99.driver.fanuc.gcode; +namespace l99.driver.fanuc.utils.gcode; /* block tracking usage private Blocks _blocks = new Blocks(); diff --git a/fanuc/utils/IntermediateModelGenerator.cs b/fanuc/utils/IntermediateModelGenerator.cs index 502ca36..b6a27d3 100644 --- a/fanuc/utils/IntermediateModelGenerator.cs +++ b/fanuc/utils/IntermediateModelGenerator.cs @@ -1,7 +1,7 @@ using l99.driver.@base; // ReSharper disable once CheckNamespace -namespace l99.driver.fanuc; +namespace l99.driver.fanuc.utils; public class IntermediateModelGenerator { diff --git a/fanuc/utils/JsonFlattenExtensions.cs b/fanuc/utils/JsonFlattenExtensions.cs index 04451c2..be2636e 100644 --- a/fanuc/utils/JsonFlattenExtensions.cs +++ b/fanuc/utils/JsonFlattenExtensions.cs @@ -1,6 +1,7 @@ #pragma warning disable CS8600, CS8601, CS8602, CS8603, CS8604, CS8625 -namespace l99.driver.fanuc; +// ReSharper disable once CheckNamespace +namespace l99.driver.fanuc.utils; // source: https://raw.githubusercontent.com/GFoley83/JsonFlatten/master/JsonFlatten/JsonExtensions.cs public static class JsonFlattenExtensions diff --git a/fanuc/utils/MTCDeviceModelGenerator.cs b/fanuc/utils/MTCDeviceModelGenerator.cs new file mode 100644 index 0000000..123173e --- /dev/null +++ b/fanuc/utils/MTCDeviceModelGenerator.cs @@ -0,0 +1,105 @@ +using System.IO; +using System.Xml.Linq; +using l99.driver.@base; +using Scriban; +using Scriban.Runtime; + +// ReSharper disable once CheckNamespace +namespace l99.driver.fanuc; + +// ReSharper disable once InconsistentNaming +public class MTCDeviceModelGenerator +{ + private readonly ILogger _logger; + private readonly Machine _machine; + private readonly dynamic _transport; + + public MTCDeviceModelGenerator(Machine machine, dynamic transport) + { + _logger = LogManager.GetLogger(GetType().FullName); + _machine = machine; + _transport = transport; + } + + public void Generate(dynamic model) + { + if (!_transport["generator"]["enabled"]) + return; + + try + { + var generator = _transport["generator"]; + + Template tp = null!; + var so = new ScriptObject(); + var tc = new TemplateContext(); + + var paths = model.structure.Keys; + + var axes = new Dictionary>(); + var spindles = new Dictionary>(); + + foreach (var path in model.structure.Keys) + { + axes.Add(path, model.structure[path].Item1); + spindles.Add(path, model.structure[path].Item2); + } + + so.Import("GenerateAxis", + new Func((section, path, axis) => + { + so.SetValue("path", path, true); + so.SetValue("axis", axis, true); + so.SetValue("spindle", null, true); + tp = Template.Parse(section); + var x = tp.Render(tc); + so.SetValue("path", null, true); + so.SetValue("axis", null, true); + return x; + })); + + so.Import("GenerateSpindle", + new Func((section, path, spindle) => + { + so.SetValue("path", path, true); + so.SetValue("axis", null, true); + so.SetValue("spindle", spindle, true); + tp = Template.Parse(section); + var x = tp.Render(tc); + so.SetValue("path", null, true); + so.SetValue("spindle", null, true); + return x; + })); + + so.Import("GeneratePath", + new Func((section, path) => + { + so.SetValue("path", path, true); + so.SetValue("axis", null, true); + so.SetValue("spindle", null, true); + tp = Template.Parse(section); + var x = tp.Render(tc); + so.SetValue("path", null, true); + return x; + })); + + tc.PushGlobal(so); + + so.SetValue("generator", generator, true); + so.SetValue("device", _transport["device_name"], true); + so.SetValue("paths", paths, true); + so.SetValue("axes", axes, true); + so.SetValue("spindles", spindles, true); + tp = Template.Parse(generator["root"]); + var xml = tp.Render(tc); + + tp = Template.Parse(generator["output"]); + var fileOut = tp.Render(tc); + File.WriteAllText(fileOut, XDocument.Parse(xml).ToString()); + } + catch (Exception ex) + { + _logger.Error(ex, $"[{_machine.Id} MTC device model generation failed!"); + } + } +} \ No newline at end of file diff --git a/fanuc/utils/Network.cs b/fanuc/utils/Network.cs index 364fcf8..77f14a1 100644 --- a/fanuc/utils/Network.cs +++ b/fanuc/utils/Network.cs @@ -1,6 +1,6 @@ // ReSharper disable once CheckNamespace -namespace l99.driver.fanuc; +namespace l99.driver.fanuc.utils; public static class Network { diff --git a/fanuc/utils/SingleThreadBlockingRunner.cs b/fanuc/utils/SingleThreadBlockingRunner.cs index 33de291..84ec763 100644 --- a/fanuc/utils/SingleThreadBlockingRunner.cs +++ b/fanuc/utils/SingleThreadBlockingRunner.cs @@ -1,5 +1,5 @@ // ReSharper disable once CheckNamespace -namespace l99.driver.fanuc; +namespace l99.driver.fanuc.utils; // https://stackoverflow.com/questions/61530632/forcing-certain-code-to-always-run-on-the-same-thread public class SingleThreadBlockingRunner diff --git a/fanuc/veneers/GCodeBlocks.cs b/fanuc/veneers/GCodeBlocks.cs index ba1d9af..a934203 100644 --- a/fanuc/veneers/GCodeBlocks.cs +++ b/fanuc/veneers/GCodeBlocks.cs @@ -1,5 +1,5 @@ using l99.driver.@base; -using l99.driver.fanuc.gcode; +using l99.driver.fanuc.utils.gcode; //TODO: review relationship between pointer and block counter