diff --git a/base-driver b/base-driver index a9fc7d2..5f92ad1 160000 --- a/base-driver +++ b/base-driver @@ -1 +1 @@ -Subproject commit a9fc7d263b77c8d18cae9540282599b4053f8159 +Subproject commit 5f92ad13f4173c6252807733da20c29ba4db9077 diff --git a/examples/fanuc-driver/config-example.yml b/examples/fanuc-driver/config-example.yml index 99ca116..2d0c217 100644 --- a/examples/fanuc-driver/config-example.yml +++ b/examples/fanuc-driver/config-example.yml @@ -62,9 +62,9 @@ system: {{observation.name}}, {{-}}machine={{observation.machine}}, {{-}}path={{observation.marker[0].number}} - program_name="{{data.program.name}}", - {{-}}program_comment="{{data.program.comment}}", - {{-}}program_modified={{data.program.modified}}, + program_name="{{data.program.main.name}}", + {{-}}program_comment="{{data.program.main.comment}}", + {{-}}program_modified={{data.program.main.modified}}, {{-}}pieces_produced={{data.pieces.produced}}, {{-}}pieces_produced_life={{data.pieces.produced_life}}, {{-}}pieces_remaining={{data.pieces.remaining}}, @@ -320,10 +320,10 @@ system: ShdrEvent p+`_part_count_life` data.pieces.produced_life; ShdrEvent p+`_part_count_complete` data.pieces.produced; ShdrEvent p+`_part_count_remain` data.pieces.remaining; - ShdrEvent p+`_prg_name` data.program.name; - ShdrEvent p+`_prg_cmt` data.program.comment; - ShdrEvent p+`_prg_size` data.program.size_b; - ShdrEvent p+`_prg_mod` data.program.modified; + ShdrEvent p+`_prg_name` data.program.main.name; + ShdrEvent p+`_prg_cmt` data.program.main.comment; + ShdrEvent p+`_prg_size` data.program.main.size_b; + ShdrEvent p+`_prg_mod` data.program.main.modified; l99.driver.fanuc.veneers.GCodeBlocks, fanuc: >- p = device+`_p`+observation.marker[0].number; if (array.size data.blocks) == 0 @@ -443,6 +443,14 @@ user: ip: 172.16.13.50 port: !!int 8193 timeout_s: !!int 3 + source-4: &source-4 + # example fanuc source + l99.driver.fanuc.FanucMachine, fanuc: + sweep_ms: !!int 1000 + net: + ip: 192.168.1.50 + port: !!int 8193 + timeout_s: !!int 3 # collectors collector-0: &collector-0 # example collector @@ -476,7 +484,7 @@ user: enabled: !!bool true net: type: tcp - ip: 10.1.10.170 + ip: localhost port: !!int 1883 anonymous: !!bool true user: @@ -597,7 +605,7 @@ machines: <<: *change-filter - id: f_sim <<: *machine-base - #<<: *machine-disabled + <<: *machine-disabled <<: *source-1 <<: *collector-1 <<: *target-spb-1 @@ -606,7 +614,7 @@ machines: #<<: *no-filter - id: f13_50 # StarCNC SR38-A <<: *machine-base - #<<: *machine-disabled + <<: *machine-disabled <<: *source-2 <<: *collector-1 <<: *target-spb-1 @@ -621,4 +629,13 @@ machines: <<: *target-spb-1 <<: *change-filter #<<: *target-shdr-3 + #<<: *no-filter + - id: f1_50 # Takisawa TMM-250 + <<: *machine-base + #<<: *machine-disabled + <<: *source-4 + <<: *collector-1 + <<: *target-mqtt-1 + #<<: *target-null + <<: *change-filter #<<: *no-filter \ No newline at end of file diff --git a/fanuc/collectors/ProductionData.cs b/fanuc/collectors/ProductionData.cs index 56e968c..47e1ed1 100644 --- a/fanuc/collectors/ProductionData.cs +++ b/fanuc/collectors/ProductionData.cs @@ -22,14 +22,26 @@ await strategy.SetNativeKeyed($"program_number", await strategy.SetNativeKeyed($"program_name", await strategy.Platform.ExePrgNameAsync()); - var o_num = strategy.GetKeyed($"program_name") - .response.cnc_exeprgname.exeprg.o_num; + + // not supported on 16i + //var o_num = strategy.GetKeyed($"program_name") + // .response.cnc_exeprgname.exeprg.o_num; + + var running_num = strategy.GetKeyed($"program_number") + .response.cnc_rdprgnum.prgnum.data; + + var main_num = strategy.GetKeyed($"program_number") + .response.cnc_rdprgnum.prgnum.mdata; + //System.Console.WriteLine($"{this.strategy.Machine.Id} {current_path} {b.response.cnc_rdprgnum.prgnum.data} {b.response.cnc_rdprgnum.prgnum.mdata}"); await strategy.Peel("production", strategy.GetKeyed($"program_name"), + strategy.GetKeyed("program_number"), + await strategy.SetNativeKeyed($"prog_dir", + await strategy.Platform.RdProgDir3Async(running_num)), await strategy.SetNativeKeyed($"prog_dir", - await strategy.Platform.RdProgDir3Async(o_num)), + await strategy.Platform.RdProgDir3Async(main_num)), await strategy.SetNativeKeyed($"pieces_produced", await strategy.Platform.RdParamDoubleWordNoAxisAsync(6711)), await strategy.SetNativeKeyed($"pieces_produced_life", diff --git a/fanuc/strategies/FanucExtendedStrategy.cs b/fanuc/strategies/FanucExtendedStrategy.cs index f8d0f6d..0e1282d 100644 --- a/fanuc/strategies/FanucExtendedStrategy.cs +++ b/fanuc/strategies/FanucExtendedStrategy.cs @@ -577,6 +577,7 @@ await SetNativeAndPeel("spindle_names", { _currentCollectSegment = SegmentEnum.AXIS; dynamic axis_name = axis_names[current_axis-1]; + //Debug.Print($"PATH:{current_path} AXIS:{axis_name}"); dynamic axis_marker = axisMarker(current_axis, axis_name); dynamic axis_marker_full = new[] {path_marker, axis_marker}; await Set("axis_split", new[] {current_path.ToString(), axis_name}); @@ -590,6 +591,7 @@ await SetNativeAndPeel("spindle_names", { _currentCollectSegment = SegmentEnum.SPINDLE; dynamic spindle_name = spindle_names[current_spindle-1]; + //Debug.Print($"PATH:{current_path} SPINDLE:{spindle_name}"); dynamic spindle_marker = spindleMarker(current_spindle, spindle_name); dynamic spindle_marker_full = new[] {path_marker, spindle_marker}; await Set("spindle_split", new[] {current_path.ToString(), spindle_name}); diff --git a/fanuc/veneers/AxisData.cs b/fanuc/veneers/AxisData.cs index 6bc8611..d096564 100644 --- a/fanuc/veneers/AxisData.cs +++ b/fanuc/veneers/AxisData.cs @@ -14,7 +14,8 @@ public AxisData(string name = "", bool isCompound = false, bool isInternal = fal protected override async Task AnyAsync(dynamic input, params dynamic?[] additionalInputs) { - if (additionalInputs.Slice(0,7).All(o => o.success == true)) + // skip index 7 - power consumption + if (additionalInputs.Slice(0,6).All(o => o.success == true)) { var current_axis = input; var axes_names = additionalInputs[0]; diff --git a/fanuc/veneers/ProductionData.cs b/fanuc/veneers/ProductionData.cs index 60ee7d1..2ac213a 100644 --- a/fanuc/veneers/ProductionData.cs +++ b/fanuc/veneers/ProductionData.cs @@ -10,11 +10,20 @@ public ProductionData(string name = "", bool isCompound = false, bool isInternal { program = new { - name = string.Empty, - number = -1, - size_b = -1, - comment = string.Empty, - modified = -1 + running = new { + name = string.Empty, + number = -1, + size_b = -1, + comment = string.Empty, + modified = -1 + }, + main = new { + name = string.Empty, + number = -1, + size_b = -1, + comment = string.Empty, + modified = -1 + } }, pieces = new { @@ -31,22 +40,37 @@ public ProductionData(string name = "", bool isCompound = false, bool isInternal protected override async Task AnyAsync(dynamic input, params dynamic?[] additionalInputs) { - if (input.success && additionalInputs.All(o => o.success == true)) + // remove input.success check for 16i + if (additionalInputs.All(o => o.success == true)) { - bool has_prog = input.response.cnc_exeprgname.exeprg.o_num > 0; - long modified = 0; + bool has_prog_name_running = input.response.cnc_exeprgname.exeprg.o_num > 0; + long modified_running = 0; + long modified_main = 0; try { - modified = has_prog - ? new DateTimeOffset(new DateTime( - additionalInputs[0].response.cnc_rdprogdir3.buf.dir1.mdate.year, - additionalInputs[0].response.cnc_rdprogdir3.buf.dir1.mdate.month, - additionalInputs[0].response.cnc_rdprogdir3.buf.dir1.mdate.day, - additionalInputs[0].response.cnc_rdprogdir3.buf.dir1.mdate.hour, - additionalInputs[0].response.cnc_rdprogdir3.buf.dir1.mdate.minute, 0)) - .ToUnixTimeMilliseconds() - : 0; + modified_running = new DateTimeOffset(new DateTime( + additionalInputs[1].response.cnc_rdprogdir3.buf.dir1.mdate.year, + additionalInputs[1].response.cnc_rdprogdir3.buf.dir1.mdate.month, + additionalInputs[1].response.cnc_rdprogdir3.buf.dir1.mdate.day, + additionalInputs[1].response.cnc_rdprogdir3.buf.dir1.mdate.hour, + additionalInputs[1].response.cnc_rdprogdir3.buf.dir1.mdate.minute, 0)) + .ToUnixTimeMilliseconds(); + } + catch + { + + } + + try + { + modified_main = new DateTimeOffset(new DateTime( + additionalInputs[2].response.cnc_rdprogdir3.buf.dir1.mdate.year, + additionalInputs[2].response.cnc_rdprogdir3.buf.dir1.mdate.month, + additionalInputs[2].response.cnc_rdprogdir3.buf.dir1.mdate.day, + additionalInputs[2].response.cnc_rdprogdir3.buf.dir1.mdate.hour, + additionalInputs[2].response.cnc_rdprogdir3.buf.dir1.mdate.minute, 0)) + .ToUnixTimeMilliseconds(); } catch { @@ -56,20 +80,29 @@ protected override async Task AnyAsync(dynamic input, params dynamic?[] var current_value = new { program = new { - name = has_prog ? new string(input.response.cnc_exeprgname.exeprg.name).AsAscii() : "", - number = input.response.cnc_exeprgname.exeprg.o_num, - size_b = additionalInputs[0].response.cnc_rdprogdir3.buf.dir1.length, - comment = additionalInputs[0].response.cnc_rdprogdir3.buf.dir1.comment, - modified + running = new { + name = has_prog_name_running ? new string(input.response.cnc_exeprgname.exeprg.name).AsAscii() : "", + number = additionalInputs[0].response.cnc_rdprgnum.prgnum.data, + size_b = additionalInputs[1].response.cnc_rdprogdir3.buf.dir1.length, + comment = additionalInputs[1].response.cnc_rdprogdir3.buf.dir1.comment, + modified = modified_running + }, + main = new { + name = "", + number = additionalInputs[0].response.cnc_rdprgnum.prgnum.mdata, + size_b = additionalInputs[2].response.cnc_rdprogdir3.buf.dir1.length, + comment = additionalInputs[2].response.cnc_rdprogdir3.buf.dir1.comment, + modified = modified_main + } }, pieces = new { - produced = additionalInputs[1].response.cnc_rdparam.param.data.ldata, - produced_life = additionalInputs[2].response.cnc_rdparam.param.data.ldata, - remaining = additionalInputs[3].response.cnc_rdparam.param.data.ldata + produced = additionalInputs[3].response.cnc_rdparam.param.data.ldata, + produced_life = additionalInputs[4].response.cnc_rdparam.param.data.ldata, + remaining = additionalInputs[5].response.cnc_rdparam.param.data.ldata }, timers = new { - cycle_time_ms = (additionalInputs[4].response.cnc_rdparam.param.data.ldata * 60000) + - additionalInputs[5].response.cnc_rdparam.param.data.ldata + cycle_time_ms = (additionalInputs[6].response.cnc_rdparam.param.data.ldata * 60000) + + additionalInputs[7].response.cnc_rdparam.param.data.ldata } }; diff --git a/fanuc/veneers/SpindleData.cs b/fanuc/veneers/SpindleData.cs index b2e641d..2080cc6 100644 --- a/fanuc/veneers/SpindleData.cs +++ b/fanuc/veneers/SpindleData.cs @@ -46,7 +46,9 @@ private string load_EU(short unit) protected override async Task AnyAsync(dynamic input, params dynamic?[] additionalInputs) { - if (additionalInputs.All(o => o.success == true)) + // let the data output even if incorrect + // TODO + //if (additionalInputs.All(o => o.success == true)) { var current_spindle = input; var spindle_names = additionalInputs[0]; @@ -122,9 +124,9 @@ protected override async Task AnyAsync(dynamic input, params dynamic?[] await onDataChangedAsync(input, current_value); } } - else + //else { - await onErrorAsync(input); + // await onErrorAsync(input); } return new { veneer = this }; diff --git a/fanuc/veneers/SysInfo.cs b/fanuc/veneers/SysInfo.cs index a789c9d..19fef8e 100644 --- a/fanuc/veneers/SysInfo.cs +++ b/fanuc/veneers/SysInfo.cs @@ -183,7 +183,7 @@ protected override async Task AnyAsync(dynamic input, params dynamic?[] await onDataArrivedAsync(input, current_value); - if (!current_value.Equals(this.lastChangedValue)) + if (current_value.IsDifferentString((object)lastChangedValue)) { await onDataChangedAsync(input, current_value); }