基于调用ZLG自带的dll库文件和ZLG.PY中定义的接口函数,二次开发,收、发message,检测和判定信号值

def Send_CAN_Data(self, FrameNum, ExtendFrame, RemoteFrame, ID, dlc, Data, chn_handle):
    transmit_num = FrameNum
    msgs = (ZCAN_Transmit_Data * transmit_num)()
    for i in range(transmit_num):
        msgs[i].transmit_type = 0  # 0-正常发送,2-自发自收
        msgs[i].frame.eff = ExtendFrame  # 0-标准帧,1-扩展帧
        msgs[i].frame.rtr = RemoteFrame  # 0-数据帧,1-远程帧
        msgs[i].frame.can_id = ID
        msgs[i].frame.can_dlc = dlc
        for j in range(msgs[i].frame.can_dlc):
            msgs[i].frame.data[j] = Data[j]
        ret = zcanlib.Transmit(chn_handle, msgs, transmit_num)
        print("Tranmit Num: %d." % ret)

def Receive_Can_Message(self, ID, DataBuffer, chn_handle):
    JudgeFlag = 0
    while True:
        ReceiveDataStr = ''
        rcv_num = zcanlib.GetReceiveNum(chn_handle, ZCAN_TYPE_CAN)  # 接收can信号
        rcv_canfd_num = zcanlib.GetReceiveNum(chn_handle, ZCAN_TYPE_CANFD)  # 接收fdcan信号
        if JudgeFlag == 1:
            break
        elif rcv_num:  # 接收到了can信号
            print("Receive CAN message number:%d" % rcv_num)
            rcv_msg, rcv_num = zcanlib.Receive(chn_handle, rcv_num)
            for i in range(rcv_num):  # 下面的几个参数是can报文中的参数,不多解释
                if rcv_msg[i].frame.can_id == ID:
                    print(rcv_msg[i].frame.can_dlc)
                    for j in range(rcv_msg[i].frame.can_dlc):
                        DataBuffer.append(hex(rcv_msg[i].frame.data[j]))
                        ReceiveDataStr = ReceiveDataStr + ' ' + hex(rcv_msg[i].frame.data[j])
                    print('data len is %x' % len(DataBuffer))
                    JudgeFlag = 1
                    DataBuffer = []
                    print("data:%s" % ReceiveDataStr)  # hex是查看16进制的报文
                    print("JudgeFlag is %d" % JudgeFlag)

        elif rcv_canfd_num:  # 接收到了fdcan信号
            print("Receive CANFD message number:%d" % rcv_canfd_num)
            rcv_canfd_msgs, rcv_canfd_num = zcanlib.ReceiveFD(chn_handle, rcv_canfd_num)
            for i in range(rcv_canfd_num):
                if rcv_msg[i].frame.can_id == ID:
                    for j in range(rcv_msg[i].frame.can_dlc):
                        DataBuffer[j] = hex(rcv_msg[i].frame.data[j])
                        ReceiveDataStr = ReceiveDataStr + ' ' + hex(rcv_msg[i].frame.data[j])
                    print('data len is %x' % len(DataBuffer))
                    DataBuffer = []
                    JudgeFlag = 1
                    print("data:%s" % ReceiveDataStr)  # hex是查看16进制的报文
                    print("JudgeFlag is %d" % JudgeFlag)

        else:
            print("no msg")
            time.sleep(0.1)

# ZLG_judage singnal value_Try by Jingyao
def CheckSiganlValue(self, chn_handle,SignalName, MessageID, CrossByte, Length, StartBit, StopBit, CheckValue):
    DataBuffer = []
    if CrossByte == False:
       BytePos = int(StartBit / 8)
       offset = StartBit - 8 * BytePos
       if Length == 1:
            self.Receive_Can_Message(MessageID, DataBuffer, chn_handle)
            hex_integer=int(DataBuffer[BytePos],0)
            ActualValue = (hex_integer & ((0xFF >> 7) << offset))>>offset
            # ActualValue = (hex(DataBuffer[BytePos]) & ((0xFF >> 7) << offset))
            if ActualValue == CheckValue:
                print("Signal %s value is right %d" %(SignalName,ActualValue))
                return True
            else:
                print("Signal %s value is right %d" %(SignalName,ActualValue))
            return False
       elif Length != 1:
            self.Receive_Can_Message(MessageID, DataBuffer, chn_handle)
            print(DataBuffer[BytePos])
            hex_integer = int(DataBuffer[BytePos], 0)#将16进制的字符串转换为十进制整数
            ActualValue = (hex_integer & ((0xFF >> (8 - (StopBit - StartBit + 1))) << offset))>>offset
            # ActualValue = (DataBuffer[BytePos] & ((0xFF >> (8-(StopBit-StartBit+1))) << offset))
            if ActualValue == CheckValue:
                print("Signal %s value is right %d" %(SignalName, ActualValue))
                return True
            else:
                print("Signal %s value is wrong %d" %(SignalName, ActualValue))
                return False
    elif CrossByte == True:
        if (Length<=8):
            BytePos1=int(StopBit/8)
            BytePos2 = int(StartBit/8)
            offset1=8-((StopBit%8)+1)
            if StartBit%8==0:
               offset2=0
            else:
               offset2=StartBit%8
        self.Receive_Can_Message(MessageID, DataBuffer, chn_handle)
        hex_integer1 = int(DataBuffer[BytePos1], 0)#将16进制的字符串转换为十进制整数
        hex_integer2 = int(DataBuffer[BytePos2], 0)#将16进制的字符串转换为十进制整数
        # ActualValue1 = (DataBuffer[BytePos1] & (0xFF >> offset1) << offset1) >> offset1
        # ActualValue2 = (DataBuffer[BytePos2] & (0xFF >> offset2)) >> (StartBit % 8)
        ActualValue1 = hex_integer1 & (0xFF >> offset1)
        print(ActualValue1)
        ActualValue2 = hex_integer2 & ((0xFF >> offset2)<<offset2)
        print(ActualValue2)
        ActualValue=ActualValue2^ActualValue1
        if ActualValue == CheckValue:
            print("Signal %s value is right %d" % (SignalName, ActualValue))
            return True
        else:
            print("Signal %s value is wrong %d" % (SignalName, ActualValue))
            return False
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐