xinnian12138 2024-08-07 13:50 采纳率: 0%
浏览 58
已结题

Python调用Canalyzer发报文

使用Python调用CANalyzer发送报文。目前CANalyzer已经能够运行,可以监听报文,但在发送报文时遇到问题。

img

from RunAll import *

app = CanoeSync()
total = 0
suc_total = 0
fail_total = 0
app.Start()

while not msvcrt.kbhit():
    EngineSpeed = app.get_SigVal(channel_num=1, msg_name="CemBodyFr103", sig_name="ShortDropWinDrvrDoor", bus_type="CAN")
    print(EngineSpeed)
    app.set_SigVal(channel_num=1, msg_name="CemBodyFr103", sig_name="ShortDropWinDrvrDoor", bus_type="CAN", setValue=2.0)



def Set_SigVal(self, chanel_num, msg_name, sig_name, bus_type, setValue):
        if (self.application != None):
            result = self.application.GetBus(bus_type).GetSignal(chanel_num, msg_name, sig_name)
            result.Value = setValue
        else:
            raise RuntimeError("CANoe is not Open, unable to set signal value")
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/KCSDN_1212/article/details/120435210

write打印:System 01-0083 SetSignal was called for signal 'Signal:CAN1/CAN_LEFT/CemBodyFr103/ShortDropWinDrvrDoor', but no signal driver is available.

img

  • 写回答

27条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-08-07 13:58
    关注
    获得1.00元问题酬金

    🕒下午好,题主!目前:🟢[在线]
    📢参考通义千问、由郭老师整理提供!
    📣今日诗号:春水碧于天,画船听雨眠。

    import comtypes.client
    import time
    import msvcrt
    
    class CanoeSync:
        def __init__(self):
            self.application = None
    
        def Start(self):
            # 连接到 CANalyzer COM server
            try:
                self.application = comtypes.client.CreateObject("CANoe.Application")
                self.application.Open(r"C:\Users\YourUserName\Documents\Vector\CANoe\Sample Configurations\CANoe_Demo_EN.cfg", False)  # 请将路径替换为您的 CANoe 配置文件路径
            except Exception as e:
                print(f"无法连接到 CANalyzer: {e}")
                raise
    
        def get_SigVal(self, channel_num, msg_name, sig_name, bus_type="CAN"):
            if self.application:
                try:
                    bus = self.application.GetBus(bus_type)
                    message = bus.GetMessage(msg_name)
                    signal = message.GetSignal(sig_name)
                    value = signal.Value
                    return value
                except Exception as e:
                    print(f"获取信号值失败: {e}")
                    return None
            else:
                raise RuntimeError("CANoe 未打开,无法获取信号值")
    
        def set_SigVal(self, channel_num, msg_name, sig_name, bus_type, setValue):
            if self.application:
                try:
                    bus = self.application.GetBus(bus_type)
                    message = bus.GetMessage(msg_name)
                    signal = message.GetSignal(sig_name)
                    signal.Value = setValue
    
                    # 发送报文
                    message.Transmit() 
    
                except Exception as e:
                    print(f"设置信号值失败: {e}")
            else:
                raise RuntimeError("CANoe 未打开,无法设置信号值")
    
    if __name__ == "__main__":
        app = CanoeSync()
        total = 0
        suc_total = 0
        fail_total = 0
    
        try:
            app.Start()
            print("已连接到 CANalyzer")
            while not msvcrt.kbhit():
                engine_speed = app.get_SigVal(channel_num=1, msg_name="CemBodyFr103", sig_name="ShortDropWinDrvrDoor", bus_type="CAN")
                print(f"EngineSpeed: {engine_speed}")
                
                # 设置信号值并发送报文
                app.set_SigVal(channel_num=1, msg_name="CemBodyFr103", sig_name="ShortDropWinDrvrDoor", bus_type="CAN", setValue=2) 
                
                time.sleep(1)  # 调整发送频率
        except Exception as e:
            print(f"发生错误: {e}")
        finally:
            if app.application:
                app.application.Quit()
    

    代码说明:

    1. 导入必要的库:

      • comtypes.client: 用于创建 CANalyzer COM 对象。
      • time: 用于设置循环的延迟。
      • msvcrt: 用于非阻塞地检测键盘输入。
    2. 创建 CanoeSync 类:

      • __init__: 初始化 application 为 None。
      • Start: 连接到 CANalyzer COM server 并打开指定的配置文件。
      • get_SigVal: 获取指定信号的值。
      • set_SigVal: 设置指定信号的值,并 发送报文
    3. 主程序:

      • 创建 CanoeSync 对象。
      • 调用 Start() 方法连接到 CANalyzer。
      • 在循环中:
        • 使用 get_SigVal() 获取信号值并打印。
        • 使用 set_SigVal() 设置信号值并发送报文。
        • 使用 time.sleep() 设置循环延迟。
      • 程序结束时,调用 app.application.Quit() 关闭 CANalyzer。

    注意:

    • 请将 r"C:\Users\YourUserName\Documents\Vector\CANoe\Sample Configurations\CANoe_Demo_EN.cfg" 替换为您实际的 CANoe 配置文件路径。
    • 请确保您的 CANoe 版本和 Python 版本兼容,并已正确安装 comtypes 库。
    • 请检查您的代码中使用的通道号、消息名、信号名和总线类型是否与 CANoe 配置文件中的一致。
    • 请确认您的 CANalyzer 软件已获得授权,并且您的电脑能够连接到 CAN 网络。
    • 如果仍然遇到问题,请提供更详细的错误信息,以便我们更好地帮助您解决问题。

    希望这些信息能帮到您! 如果您还有其他问题,请随时提出。

    评论

报告相同问题?

问题事件

  • 系统已结题 8月15日
  • 修改了问题 8月7日
  • 修改了问题 8月7日
  • 赞助了问题酬金50元 8月7日
  • 展开全部

悬赏问题

  • ¥15 mmseqs内存报错
  • ¥15 vika文档如何与obsidian同步
  • ¥15 华为手机相册里面的照片能够替换成自己想要的照片吗?
  • ¥15 陆空双模式无人机飞控设置
  • ¥15 sentaurus lithography
  • ¥100 求抖音ck号 或者提ck教程
  • ¥15 关于#linux#的问题:子进程1等待子进程A、B退出后退出(语言-c语言)
  • ¥20 web页面如何打开Outlook 365的全球离线通讯簿功能
  • ¥15 io.jsonwebtoken.security.Keys
  • ¥15 急,ubuntu安装后no caching mode page found等