上一篇文章:使用python中的生成器实现周期性报文发送功能。在这一篇文章中简单介绍了如何使用python的生成器概念实现提取不同信号物理量自动周期性的发送报文。
但是,上一篇文章中未考虑多个信号共用一个帧ID发送报文的场景,仅支持一个信号占用一个帧ID发送报文。基于此,优化代码结构实现多个信号共用一个帧ID发送报文的场景。
事先将待发送信号的物理量存入特定的excel模板,由于按照模板发送报文已提前确定了信号,所以可以采用事先合并报文的方式实现每帧报文的发送。
新增get_merge_item_dict()函数用于查找帧ID相同的信号,存入字典,get_merge_item_dict()函数定义如下:
def get_merge_item_dict(self):
# 解决多个信号共用一个报文ID发送数据的问题,真正发送的报文信号以全局变量item_list为基准
self.merge_item_dict = dict()
msg_id_list = []
msg_id_idx = msg_operation_list.index("报文ID") - 1
for item in item_list:
msg_id = str(self.operation_dict[item][msg_id_idx])
msg_id_list.append(msg_id)
solo_msg_id_list = list(set(msg_id_list))
# 以报文ID为字典的键,并入报文发送信号
for solo_msg_id in solo_msg_id_list:
temp_merge_list = []
for item in item_list:
msg_id = str(self.operation_dict[item][msg_id_idx])
if msg_id == solo_msg_id:
temp_merge_list.append(item)
self.merge_item_dict[solo_msg_id] = temp_merge_list
将上一篇文章:使用python中的生成器实现周期性报文发送功能,采用python的生成器每次执行信号的一个物理量的报文发送过程,改成先合并帧ID相同信号的报文数据再采用python的生成器每次执行同一个唯一的帧ID的一条报文数据的周期性报文发送过程。
原来采用python的生成器每次执行信号的一个物理量的报文发送过程,与python生成器概念相关的主要实现函数如下:
def set_yield_func(self):
item_yield_func_dict = dict()
for i in range(len(item_list)):
item_yield_func_dict[item_list[i]] = self.yield_item_value(i)
return item_yield_func_dict
def yield_item_value(self, item_idx):
item_value_list = self.item_value_dict[item_list[item_idx]]
for i in range(len(item_value_list)):
yield item_value_list[i]
目前采用先合并帧ID相同信号的报文数据再采用python的生成器每次执行同一个唯一的帧ID的一条报文数据的周期性报文发送过程,与python生成器概念相关的主要实现函数如下:
def set_yield_func_new(self):
item_yield_func_dict = dict()
for idx in range(len(list(self.merge_item_dict.keys()))):
solo_msg_id = list(self.merge_item_dict.keys())[idx]
item_yield_func_dict[solo_msg_id] = self.yield_item_msg(solo_msg_id)
return item_yield_func_dict
def yield_item_msg(self, solo_msg_id):
# 生成器每次NEXT的是报文
merge_msg_data_list = []
merge_item_list = self.merge_item_dict[solo_msg_id]
# 以相同帧ID的第一个报文发送信号的物理取值数组为准
first_item_value_list = self.item_value_dict[merge_item_list[0]]
for idx in range(len(first_item_value_list)):
phy_value_list = []
for item in merge_item_list:
item_value = self.item_value_dict[item][idx]
phy_value_list.append(item_value)
# 合并报文
msg_data = self.merge_msg_data(merge_item_list, phy_value_list)
merge_msg_data_list.append(msg_data)
for idx in range(len(merge_msg_data_list)):
yield merge_msg_data_list[idx]