Explorar o código

五号机稳定版(貌似L7有问题)

oldwine hai 3 meses
pai
achega
77a896e421
Modificáronse 5 ficheiros con 255 adicións e 138 borrados
  1. 82 82
      conf/5#nodes.csv
  2. 46 46
      conf/6#nodes.csv
  3. 2 2
      main.py
  4. 28 5
      models/billet_trace_pusher.py
  5. 97 3
      utils/s7data.py

+ 82 - 82
conf/5#nodes.csv

@@ -1,82 +1,82 @@
-name,type,db,start,offset,size,read_allow,write_allow,frequency
-浇铸信号,boollist,130,0,0,1,TRUE,FALSE,500
-大包重量1,real,130,20,0,4,TRUE,FALSE,500
-大包重量2,real,130,40,0,4,TRUE,FALSE,500
-中包重量,real,130,44,0,4,TRUE,FALSE,500
-L1切割信号,boollist,131,4,0,1,TRUE,FALSE,500
-L2切割信号,boollist,132,4,0,1,TRUE,FALSE,500
-L3切割信号,boollist,133,4,0,1,TRUE,FALSE,500
-L4切割信号,boollist,134,4,0,1,TRUE,FALSE,500
-L5切割信号,boollist,135,4,0,1,TRUE,FALSE,500
-L6切割信号,boollist,136,4,0,1,TRUE,FALSE,500
-L7切割信号,boollist,137,4,0,1,TRUE,FALSE,500
-L8切割信号,boollist,138,4,0,1,TRUE,FALSE,500
-L1定尺,int,100,20,0,2,TRUE,FALSE,500
-L2定尺,int,100,22,0,2,TRUE,FALSE,500
-L3定尺,int,100,24,0,2,TRUE,FALSE,500
-L4定尺,int,100,26,0,2,TRUE,FALSE,500
-L5定尺,int,101,20,0,2,TRUE,FALSE,500
-L6定尺,int,101,22,0,2,TRUE,FALSE,500
-L7定尺,int,101,24,0,2,TRUE,FALSE,500
-L8定尺,int,101,26,0,2,TRUE,FALSE,500
-L1拉速,real,131,20,0,4,TRUE,FALSE,500
-L2拉速,real,132,20,0,4,TRUE,FALSE,500
-L3拉速,real,133,20,0,4,TRUE,FALSE,500
-L4拉速,real,134,20,0,4,TRUE,FALSE,500
-L5拉速,real,135,20,0,4,TRUE,FALSE,500
-L6拉速,real,136,20,0,4,TRUE,FALSE,500
-L7拉速,real,137,20,0,4,TRUE,FALSE,500
-L8拉速,real,138,20,0,4,TRUE,FALSE,500
-推钢机激光,real,360,56,0,4,TRUE,FALSE,500
-L1挡板,bool,131,40,0,1,TRUE,FALSE,500
-L2挡板,bool,132,40,0,1,TRUE,FALSE,500
-L3挡板,bool,133,40,0,1,TRUE,FALSE,500
-L4挡板,bool,134,40,0,1,TRUE,FALSE,500
-L5挡板,bool,135,40,0,1,TRUE,FALSE,500
-L6挡板,bool,136,40,0,1,TRUE,FALSE,500
-L7挡板,bool,137,40,0,1,TRUE,FALSE,500
-L8挡板,bool,138,40,0,1,TRUE,FALSE,500
-热送挡板,boollist,130,72,0,1,TRUE,FALSE,500
-L1坯头位置,int,100,2,0,2,TRUE,FALSE,500
-L2坯头位置,int,100,4,0,2,TRUE,FALSE,500
-L3坯头位置,int,100,6,0,2,TRUE,FALSE,500
-L4坯头位置,int,100,8,0,2,TRUE,FALSE,500
-L5坯头位置,int,101,2,0,2,TRUE,FALSE,500
-L6坯头位置,int,101,4,0,2,TRUE,FALSE,500
-L7坯头位置,int,101,6,0,2,TRUE,FALSE,500
-L8坯头位置,int,101,8,0,2,TRUE,FALSE,500
-天车A1位置,dint,360,100,0,4,TRUE,FALSE,500
-天车A2位置,dint,360,104,0,4,TRUE,FALSE,500
-天车A3位置,dint,360,108,0,4,TRUE,FALSE,500
-车1自动触发信号,bool,310,46,0,1,TRUE,FALSE,500
-车1手动触发信号,bool,310,46,1,1,TRUE,FALSE,500
-车1自动触发结果,string,310,2,0,22,TRUE,FALSE,500
-车1手动触发结果,string,310,24,0,22,TRUE,FALSE,500
-车2自动触发信号,bool,311,46,0,1,TRUE,FALSE,500
-车2手动触发信号,bool,311,46,1,1,TRUE,FALSE,500
-车2自动触发结果,string,311,2,0,22,TRUE,FALSE,500
-车2手动触发结果,string,311,24,0,22,TRUE,FALSE,500
-车3自动触发信号,bool,312,46,0,1,TRUE,FALSE,500
-车3手动触发信号,bool,312,46,1,1,TRUE,FALSE,500
-车3自动触发结果,string,312,2,0,22,TRUE,FALSE,500
-车3手动触发结果,string,312,24,0,22,TRUE,FALSE,500
-车4自动触发信号,bool,313,46,0,1,TRUE,FALSE,500
-车4手动触发信号,bool,313,46,1,1,TRUE,FALSE,500
-车4自动触发结果,string,313,2,0,22,TRUE,FALSE,500
-车4手动触发结果,string,313,24,0,22,TRUE,FALSE,500
-集群限位L1_1,boollist,105,22,0,1,TRUE,FALSE,500
-集群限位L1_2,boollist,105,23,0,1,TRUE,FALSE,500
-集群限位L2_1,boollist,105,24,0,1,TRUE,FALSE,500
-集群限位L2_2,boollist,105,25,0,1,TRUE,FALSE,500
-集群限位L3_1,boollist,105,26,0,1,TRUE,FALSE,500
-集群限位L3_2,boollist,105,27,0,1,TRUE,FALSE,500
-集群限位L4_1,boollist,105,28,0,1,TRUE,FALSE,500
-集群限位L4_2,boollist,105,29,0,1,TRUE,FALSE,500
-集群限位L5_1,boollist,105,30,0,1,TRUE,FALSE,500
-集群限位L5_2,boollist,105,31,0,1,TRUE,FALSE,500
-集群限位L6_1,boollist,105,32,0,1,TRUE,FALSE,500
-集群限位L6_2,boollist,105,33,0,1,TRUE,FALSE,500
-集群限位L7_1,boollist,105,34,0,1,TRUE,FALSE,500
-集群限位L7_2,boollist,105,35,0,1,TRUE,FALSE,500
-集群限位L8_1,boollist,105,36,0,1,TRUE,FALSE,500
-集群限位L8_2,boollist,105,37,0,1,TRUE,FALSE,500
+name,type,db,start,offset,size,read_allow,write_allow,frequency,group
+浇铸信号,boollist,130,0,0,1,TRUE,FALSE,500,1
+大包重量1,real,130,20,0,4,TRUE,FALSE,500,1
+大包重量2,real,130,40,0,4,TRUE,FALSE,500,1
+中包重量,real,130,44,0,4,TRUE,FALSE,500,1
+L1切割信号,boollist,131,4,0,1,TRUE,FALSE,500,1
+L2切割信号,boollist,132,4,0,1,TRUE,FALSE,500,1
+L3切割信号,boollist,133,4,0,1,TRUE,FALSE,500,1
+L4切割信号,boollist,134,4,0,1,TRUE,FALSE,500,1
+L5切割信号,boollist,135,4,0,1,TRUE,FALSE,500,1
+L6切割信号,boollist,136,4,0,1,TRUE,FALSE,500,1
+L7切割信号,boollist,137,4,0,1,TRUE,FALSE,500,1
+L8切割信号,boollist,138,4,0,1,TRUE,FALSE,500,1
+L1定尺,int,100,20,0,2,TRUE,FALSE,500,1
+L2定尺,int,100,22,0,2,TRUE,FALSE,500,1
+L3定尺,int,100,24,0,2,TRUE,FALSE,500,1
+L4定尺,int,100,26,0,2,TRUE,FALSE,500,1
+L5定尺,int,101,20,0,2,TRUE,FALSE,500,1
+L6定尺,int,101,22,0,2,TRUE,FALSE,500,1
+L7定尺,int,101,24,0,2,TRUE,FALSE,500,1
+L8定尺,int,101,26,0,2,TRUE,FALSE,500,2
+L1拉速,real,131,20,0,4,TRUE,FALSE,500,2
+L2拉速,real,132,20,0,4,TRUE,FALSE,500,2
+L3拉速,real,133,20,0,4,TRUE,FALSE,500,2
+L4拉速,real,134,20,0,4,TRUE,FALSE,500,2
+L5拉速,real,135,20,0,4,TRUE,FALSE,500,2
+L6拉速,real,136,20,0,4,TRUE,FALSE,500,2
+L7拉速,real,137,20,0,4,TRUE,FALSE,500,2
+L8拉速,real,138,20,0,4,TRUE,FALSE,500,2
+推钢机激光,real,360,56,0,4,TRUE,FALSE,500,2
+L1挡板,bool,131,40,0,1,TRUE,FALSE,500,2
+L2挡板,bool,132,40,0,1,TRUE,FALSE,500,2
+L3挡板,bool,133,40,0,1,TRUE,FALSE,500,2
+L4挡板,bool,134,40,0,1,TRUE,FALSE,500,2
+L5挡板,bool,135,40,0,1,TRUE,FALSE,500,2
+L6挡板,bool,136,40,0,1,TRUE,FALSE,500,2
+L7挡板,bool,137,40,0,1,TRUE,FALSE,500,2
+L8挡板,bool,138,40,0,1,TRUE,FALSE,500,2
+热送挡板,boollist,130,72,0,1,TRUE,FALSE,500,2
+L1坯头位置,int,100,2,0,2,TRUE,FALSE,500,3
+L2坯头位置,int,100,4,0,2,TRUE,FALSE,500,3
+L3坯头位置,int,100,6,0,2,TRUE,FALSE,500,3
+L4坯头位置,int,100,8,0,2,TRUE,FALSE,500,3
+L5坯头位置,int,101,2,0,2,TRUE,FALSE,500,3
+L6坯头位置,int,101,4,0,2,TRUE,FALSE,500,3
+L7坯头位置,int,101,6,0,2,TRUE,FALSE,500,3
+L8坯头位置,int,101,8,0,2,TRUE,FALSE,500,3
+天车A1位置,dint,360,100,0,4,TRUE,FALSE,500,3
+天车A2位置,dint,360,104,0,4,TRUE,FALSE,500,3
+天车A3位置,dint,360,108,0,4,TRUE,FALSE,500,3
+车1自动触发信号,bool,310,46,0,1,TRUE,FALSE,500,3
+车1手动触发信号,bool,310,46,1,1,TRUE,FALSE,500,3
+车1自动触发结果,string,310,2,0,22,TRUE,FALSE,500,3
+车1手动触发结果,string,310,24,0,22,TRUE,FALSE,500,3
+车2自动触发信号,bool,311,46,0,1,TRUE,FALSE,500,3
+车2手动触发信号,bool,311,46,1,1,TRUE,FALSE,500,3
+车2自动触发结果,string,311,2,0,22,TRUE,FALSE,500,3
+车2手动触发结果,string,311,24,0,22,TRUE,FALSE,500,3
+车3自动触发信号,bool,312,46,0,1,TRUE,FALSE,500,4
+车3手动触发信号,bool,312,46,1,1,TRUE,FALSE,500,4
+车3自动触发结果,string,312,2,0,22,TRUE,FALSE,500,4
+车3手动触发结果,string,312,24,0,22,TRUE,FALSE,500,4
+车4自动触发信号,bool,313,46,0,1,TRUE,FALSE,500,4
+车4手动触发信号,bool,313,46,1,1,TRUE,FALSE,500,4
+车4自动触发结果,string,313,2,0,22,TRUE,FALSE,500,4
+车4手动触发结果,string,313,24,0,22,TRUE,FALSE,500,4
+集群限位L1_1,boollist,105,22,0,1,TRUE,FALSE,500,4
+集群限位L1_2,boollist,105,23,0,1,TRUE,FALSE,500,4
+集群限位L2_1,boollist,105,24,0,1,TRUE,FALSE,500,4
+集群限位L2_2,boollist,105,25,0,1,TRUE,FALSE,500,4
+集群限位L3_1,boollist,105,26,0,1,TRUE,FALSE,500,4
+集群限位L3_2,boollist,105,27,0,1,TRUE,FALSE,500,4
+集群限位L4_1,boollist,105,28,0,1,TRUE,FALSE,500,4
+集群限位L4_2,boollist,105,29,0,1,TRUE,FALSE,500,4
+集群限位L5_1,boollist,105,30,0,1,TRUE,FALSE,500,4
+集群限位L5_2,boollist,105,31,0,1,TRUE,FALSE,500,4
+集群限位L6_1,boollist,105,32,0,1,TRUE,FALSE,500,4
+集群限位L6_2,boollist,105,33,0,1,TRUE,FALSE,500,5
+集群限位L7_1,boollist,105,34,0,1,TRUE,FALSE,500,5
+集群限位L7_2,boollist,105,35,0,1,TRUE,FALSE,500,5
+集群限位L8_1,boollist,105,36,0,1,TRUE,FALSE,500,5
+集群限位L8_2,boollist,105,37,0,1,TRUE,FALSE,500,5

+ 46 - 46
conf/6#nodes.csv

@@ -1,46 +1,46 @@
-name,type,db,start,offset,size,read_allow,write_allow,frequency
-浇铸信号,boollist,230,0,0,1,TRUE,FALSE,500
-大包重量1,real,230,20,0,4,TRUE,FALSE,500
-大包重量2,real,230,40,0,4,TRUE,FALSE,500
-中包重量,real,230,28,0,4,TRUE,FALSE,500
-L1切割信号,boollist,231,4,0,1,TRUE,FALSE,500
-L2切割信号,boollist,232,4,0,1,TRUE,FALSE,500
-L3切割信号,boollist,233,4,0,1,TRUE,FALSE,500
-L4切割信号,boollist,234,4,0,1,TRUE,FALSE,500
-L5切割信号,boollist,235,4,0,1,TRUE,FALSE,500
-L6切割信号,boollist,236,4,0,1,TRUE,FALSE,500
-L7切割信号,boollist,237,4,0,1,TRUE,FALSE,500
-L8切割信号,boollist,238,4,0,1,TRUE,FALSE,500
-L1定尺,int,200,20,0,2,TRUE,FALSE,500
-L2定尺,int,200,22,0,2,TRUE,FALSE,500
-L3定尺,int,200,24,0,2,TRUE,FALSE,500
-L4定尺,int,200,26,0,2,TRUE,FALSE,500
-L5定尺,int,201,20,0,2,TRUE,FALSE,500
-L6定尺,int,201,22,0,2,TRUE,FALSE,500
-L7定尺,int,201,24,0,2,TRUE,FALSE,500
-L8定尺,int,201,26,0,2,TRUE,FALSE,500
-L1拉速,real,231,20,0,4,TRUE,FALSE,500
-L2拉速,real,232,20,0,4,TRUE,FALSE,500
-L3拉速,real,233,20,0,4,TRUE,FALSE,500
-L4拉速,real,234,20,0,4,TRUE,FALSE,500
-L5拉速,real,235,20,0,4,TRUE,FALSE,500
-L6拉速,real,236,20,0,4,TRUE,FALSE,500
-L7拉速,real,237,20,0,4,TRUE,FALSE,500
-L8拉速,real,238,20,0,4,TRUE,FALSE,500
-推钢机激光,real,205,38,0,4,TRUE,FALSE,500
-L1挡板,bool,231,40,0,1,TRUE,FALSE,500
-L2挡板,bool,232,40,0,1,TRUE,FALSE,500
-L3挡板,bool,233,40,0,1,TRUE,FALSE,500
-L4挡板,bool,234,40,0,1,TRUE,FALSE,500
-L5挡板,bool,235,40,0,1,TRUE,FALSE,500
-L6挡板,bool,236,40,0,1,TRUE,FALSE,500
-L7挡板,bool,237,40,0,1,TRUE,FALSE,500
-L8挡板,bool,238,40,0,1,TRUE,FALSE,500
-L1坯头位置,int,200,2,0,2,TRUE,FALSE,500
-L2坯头位置,int,200,4,0,2,TRUE,FALSE,500
-L3坯头位置,int,200,6,0,2,TRUE,FALSE,500
-L4坯头位置,int,200,8,0,2,TRUE,FALSE,500
-L5坯头位置,int,201,2,0,2,TRUE,FALSE,500
-L6坯头位置,int,201,4,0,2,TRUE,FALSE,500
-L7坯头位置,int,201,6,0,2,TRUE,FALSE,500
-L8坯头位置,int,201,8,0,2,TRUE,FALSE,500
+name,type,db,start,offset,size,read_allow,write_allow,frequency,group
+浇铸信号,boollist,230,0,0,1,TRUE,FALSE,500,1
+大包重量1,real,230,20,0,4,TRUE,FALSE,500,1
+大包重量2,real,230,40,0,4,TRUE,FALSE,500,1
+中包重量,real,230,28,0,4,TRUE,FALSE,500,1
+L1切割信号,boollist,231,4,0,1,TRUE,FALSE,500,1
+L2切割信号,boollist,232,4,0,1,TRUE,FALSE,500,1
+L3切割信号,boollist,233,4,0,1,TRUE,FALSE,500,1
+L4切割信号,boollist,234,4,0,1,TRUE,FALSE,500,1
+L5切割信号,boollist,235,4,0,1,TRUE,FALSE,500,1
+L6切割信号,boollist,236,4,0,1,TRUE,FALSE,500,1
+L7切割信号,boollist,237,4,0,1,TRUE,FALSE,500,1
+L8切割信号,boollist,238,4,0,1,TRUE,FALSE,500,1
+L1定尺,int,200,20,0,2,TRUE,FALSE,500,1
+L2定尺,int,200,22,0,2,TRUE,FALSE,500,1
+L3定尺,int,200,24,0,2,TRUE,FALSE,500,1
+L4定尺,int,200,26,0,2,TRUE,FALSE,500,1
+L5定尺,int,201,20,0,2,TRUE,FALSE,500,1
+L6定尺,int,201,22,0,2,TRUE,FALSE,500,1
+L7定尺,int,201,24,0,2,TRUE,FALSE,500,1
+L8定尺,int,201,26,0,2,TRUE,FALSE,500,2
+L1拉速,real,231,20,0,4,TRUE,FALSE,500,2
+L2拉速,real,232,20,0,4,TRUE,FALSE,500,2
+L3拉速,real,233,20,0,4,TRUE,FALSE,500,2
+L4拉速,real,234,20,0,4,TRUE,FALSE,500,2
+L5拉速,real,235,20,0,4,TRUE,FALSE,500,2
+L6拉速,real,236,20,0,4,TRUE,FALSE,500,2
+L7拉速,real,237,20,0,4,TRUE,FALSE,500,2
+L8拉速,real,238,20,0,4,TRUE,FALSE,500,2
+推钢机激光,real,205,38,0,4,TRUE,FALSE,500,2
+L1挡板,bool,231,40,0,1,TRUE,FALSE,500,2
+L2挡板,bool,232,40,0,1,TRUE,FALSE,500,2
+L3挡板,bool,233,40,0,1,TRUE,FALSE,500,2
+L4挡板,bool,234,40,0,1,TRUE,FALSE,500,2
+L5挡板,bool,235,40,0,1,TRUE,FALSE,500,2
+L6挡板,bool,236,40,0,1,TRUE,FALSE,500,2
+L7挡板,bool,237,40,0,1,TRUE,FALSE,500,2
+L8挡板,bool,238,40,0,1,TRUE,FALSE,500,2
+L1坯头位置,int,200,2,0,2,TRUE,FALSE,500,2
+L2坯头位置,int,200,4,0,2,TRUE,FALSE,500,3
+L3坯头位置,int,200,6,0,2,TRUE,FALSE,500,3
+L4坯头位置,int,200,8,0,2,TRUE,FALSE,500,3
+L5坯头位置,int,201,2,0,2,TRUE,FALSE,500,3
+L6坯头位置,int,201,4,0,2,TRUE,FALSE,500,3
+L7坯头位置,int,201,6,0,2,TRUE,FALSE,500,3
+L8坯头位置,int,201,8,0,2,TRUE,FALSE,500,3

+ 2 - 2
main.py

@@ -35,7 +35,7 @@ s7_5.connect('192.168.1.215', 0, 0)
 data_5 = S7data(r"conf/5#nodes.csv")
 data_5.set_S7Client(s7_5)
 data_5.set_logger(logger_5)
-data_5.start_auto_update()
+data_5.auto_update_group()
 logger_5.info('[PREPARE]5#机PLC连接成功')
 
 s7_6 = S7Client()
@@ -43,7 +43,7 @@ s7_6.connect('192.168.1.216', 0, 0)
 data_6 = S7data(r"conf/6#nodes.csv")
 data_6.set_S7Client(s7_6)
 data_6.set_logger(logger_6)
-data_6.start_auto_update()
+data_6.auto_update_group()
 logger_6.info('[PREPARE]6#机PLC连接成功')
 
 

+ 28 - 5
models/billet_trace_pusher.py

@@ -60,9 +60,19 @@ class Trace_pusher:
                 Through_state_continues3(data_s7.make_point('集群限位L4_1[1]'), data_s7.make_point('集群限位L4_1[2]'), data_s7.make_point('集群限位L4_1[3]')),
                 Through_state_continues3(data_s7.make_point('集群限位L5_1[1]'), data_s7.make_point('集群限位L5_1[2]'), data_s7.make_point('集群限位L5_1[3]')),
                 Through_state_continues3(data_s7.make_point('集群限位L6_1[1]'), data_s7.make_point('集群限位L6_1[2]'), data_s7.make_point('集群限位L6_1[3]')),
-                Through_state_continues3(data_s7.make_point('集群限位L7_1[1]'), data_s7.make_point('集群限位L7_1[2]'), data_s7.make_point('集群限位L7_1[3]')),
+                Through_state_continues3(data_s7.make_point('集群限位L7_1[1]'), data_s7.make_point('集群限位L7_1[2]'), data_s7.make_point('集群限位L7_2[1]')),
                 Through_state_continues3(data_s7.make_point('集群限位L8_1[1]'), data_s7.make_point('集群限位L8_1[2]'), data_s7.make_point('集群限位L8_1[3]'))
             ]
+            self.billet_out_sig = [
+                data_s7.make_point('集群限位L1_1[1]'),
+                data_s7.make_point('集群限位L2_1[1]'),
+                data_s7.make_point('集群限位L3_1[1]'),
+                data_s7.make_point('集群限位L4_1[1]'),
+                data_s7.make_point('集群限位L5_1[1]'),
+                data_s7.make_point('集群限位L6_1[1]'),
+                data_s7.make_point('集群限位L7_1[1]'),
+                data_s7.make_point('集群限位L8_1[1]')
+            ]
         else:
             self.billet_position = [
                 self.data_s7.make_point('L1坯头位置'),
@@ -116,6 +126,7 @@ class Trace_pusher:
                 self.billet_position[i].set_reset_action(lambda i=i: self.billet_in_buffer_action(i))
             else:
                 self.billet_position[i].set_excite_action(lambda i=i: self.billet_in_buffer_action(i))
+                self.billet_out_sig[i].set_excite_action(lambda i=i: self.billet_out_action(i))
             self.billet_position[i].allow_update()
             # 挡板抬起
             self.barrier[i].allow_update(False)
@@ -146,9 +157,11 @@ class Trace_pusher:
                 self.logger.info(f"[TRACE]{i+1}流新增钢坯存储")
                 self.strands_buffer[i] = self.strands_cutting[i]
                 self.strands_cutting[i] = []
-            else:
+            elif self.billet_out[i]:
                 self.logger.info(f"[TRACE]{i+1}流开切漏钢,算法补入")
                 self.strands_buffer[i] = self.billet_out[i]
+            else:
+                self.logger.info(f"[TRACE]{i+1}流开切漏钢,但未检测到可补入钢坯的信息")
             self.billet_out[i] = []
 
         if self.barrier[i].state and self.barrier_checker[i] == False:
@@ -167,6 +180,10 @@ class Trace_pusher:
                 else:
                     self.logger.info(f"[TRACE]{i+1}流钢坯通过挡板进入推钢区域,在推钢机右侧")
                     self.pusher_right_list.append(billetData)
+        
+        if self.hostsend_flag and self.hostsend_barrier[i].state:
+            self.hostsend_barrier_up_action(i)
+
             
     def barrier_down_action(self, i):
         if self.barrier_checker[i]:
@@ -185,7 +202,8 @@ class Trace_pusher:
                         index = j
                         break
                 if index == -1:
-                    self.logger.warning(f"[TRACE]推钢机左侧未找到{i+1}流的热送钢坯")
+                    pass
+                    #self.logger.warning(f"[TRACE]推钢机左侧未找到{i+1}流的热送钢坯")
                 else:
                     gp_tmp = self.pusher_left_list[index]
                     self.pusher_left_list = self.pusher_left_list[:index] + self.pusher_left_list[index+1:]
@@ -196,15 +214,18 @@ class Trace_pusher:
                         index = j
                         break
                 if index == -1:
-                    self.logger.warning(f"[TRACE]推钢机右侧未找到{i+1}流的热送钢坯")
+                    pass
+                    #self.logger.warning(f"[TRACE]推钢机右侧未找到{i+1}流的热送钢坯")
                 else:
                     gp_tmp = self.pusher_right_list[index]
                     self.pusher_right_list = self.pusher_right_list[:index] + self.pusher_right_list[index+1:]
 
             if gp_tmp:
+                self.logger.info(f"[TRACE]{i+1}流钢坯热送")
                 if not (gp_tmp[0].startswith(self.current_heatNo) or gp_tmp[0].startswith(self.old_heatNo)):
                     self.change_heat(gp_tmp)
-                self.hostsend(gp_tmp)
+                if not gp_tmp[0].startswith('0'):
+                    self.hostsend(gp_tmp)
             
     def change_heat(self, data):
         # 换炉代码
@@ -341,6 +362,8 @@ class Trace_pusher:
         self.total += 1
         self.strand[int(strandNo)-1] += 1
         billetNo = self.current_heatNo + ccmNo + strandNo + '{:0>2}'.format(self.strand[int(strandNo)-1])
+        i[0] = billetNo
+        i[1] = self.current_heatData
         self.sender.billet_upload(self.current_heatData, billetNo, self.total, i[2], i[3], i[4], i[5], '')
 
         self.logger.info(f"{self.current_heatNo}炉钢坯热送:{billetNo}")

+ 97 - 3
utils/s7data.py

@@ -1,7 +1,33 @@
-import snap7, csv, threading, warnings, time
+import snap7, csv, threading, warnings, time, ctypes
 from utils.statepoint import *
 
-S7Client = snap7.client.Client
+class TS7DataItem(ctypes.Structure):
+    _fields_ = [
+        ('Area', ctypes.c_int),
+        ('WordLen', ctypes.c_int),
+        ('Result', ctypes.c_int),
+        ('DBNumber', ctypes.c_int),
+        ('Start', ctypes.c_int),
+        ('Amount', ctypes.c_int),
+        ('pdata', ctypes.c_void_p)
+    ]
+
+class S7Client(snap7.client.Client):
+    def multi_db_read_py(self, db_number: list, start: list, size: list):
+        count = len(size)
+        buffers = [ctypes.create_string_buffer(i) for i in size]
+        params = []
+        for i in range(count):
+            params.append(TS7DataItem(snap7.type.Areas.DB, snap7.type.WordLen.Byte, 0, db_number[i], start[i], size[i], ctypes.cast(buffers[i], ctypes.c_void_p)))
+        
+        array_type = TS7DataItem * count
+        param_array = array_type(*params)
+        result = self.read_multi_vars(param_array)
+        if result[0]:
+            raise RuntimeError("多组读取失败")
+        
+        res_rtn = [bytearray(i) for i in buffers]
+        return res_rtn
 
 class S7data:
     def __init__(self, csvfile):
@@ -13,6 +39,7 @@ class S7data:
         self.threads = []
         self.nodes = {}
         self.node_data = {}
+        self.groups = {}
         self.target_from_name = {}
         with open(csvfile) as f:
             for i in csv.DictReader(f):
@@ -21,11 +48,14 @@ class S7data:
                 else:
                     self.nodes[i['name']] = i
                     self.node_data[i['name']] = bytearray(int(i['size']))
+                    if i['group'] not in self.groups:
+                        self.groups[i['group']] = []
+                    self.groups[i['group']].append(i['name'])
 
     def set_logger(self, logger):
         self.logger = logger
 
-    def set_S7Client(self, s7c):
+    def set_S7Client(self, s7c: S7Client):
         self.S7Client = s7c
 
     def get_S7Client(self):
@@ -108,6 +138,69 @@ class S7data:
         for i in self.threads:
             i.start()
 
+    def update_group(self, group_name):
+        nodesname = self.groups[group_name]
+        db_number = []
+        start = []
+        size = []
+
+        for name in nodesname:
+            nodeinfo = self.nodes[name]
+            db_number.append(int(nodeinfo['db']))
+            start.append(int(nodeinfo['start']))
+            size.append(int(nodeinfo['size']))
+
+        while True:
+            if not self.thread_run:
+                return None
+            
+            tmp = False
+            read_valid = True
+            with self.lock:
+                if not self.S7Client.get_connected():
+                    warnings.warn('S7Client连接中断')
+                    if self.logger:
+                        self.logger.error('S7Client连接中断')
+                    self.thread_run = False
+                    return None
+
+                try:
+                    tmp = self.S7Client.multi_db_read_py(db_number, start, size)
+                except RuntimeError as reason:
+                    warnings.warn(reason)
+                    read_valid = False
+                    if self.logger:
+                        self.logger.error(reason)
+                    self.thread_run = False
+
+            if read_valid and tmp:
+                for i in range(len(tmp)):
+                    if self.node_data[nodesname[i]] != tmp[i]:
+                        self.node_data[nodesname[i]] = tmp[i]
+                        self.send(nodesname[i])
+
+    def auto_update_group(self):
+        if self.thread_run:
+            return None
+        self.threads = []
+        if self.S7Client == None:
+            warnings.warn('未初始化S7Client')
+            if self.logger:
+                self.logger.error('未初始化S7Client')
+            return None
+        if not self.S7Client.get_connected():
+            warnings.warn('S7Client未连接')
+            if self.logger:
+                self.logger.error('S7Client未连接')
+            return None
+        
+        for group in self.groups.keys():
+            self.threads.append(threading.Thread(target=self.update_group, args=(group,)))
+
+        self.thread_run = True
+        for i in self.threads:
+            i.start()
+
     def end_auto_update(self):
         self.thread_run = False
         for i in self.threads:
@@ -134,4 +227,5 @@ class S7data:
             self.target_from_name[solvedname].append(res)
         else:
             self.target_from_name[solvedname][index].append(res)
+        self.send(name)
         return res