CANoe本身预留了许多与外界实现信息交互的接口,例如用户可以在Python中使用COM Server服务轻松调用CANoe及其工程运行的各种功能(可参考《CANoe开发从入门到精通》中的扩展话题部分)。但这种方法并不适用于使用CAPL语言进行自动化测试脚本开发的情况。本文将使用UDP通信的方式,将CANoe作为客户端,Python作为服务器端,完成两者之间的信号传输。
准备工作CANoe(版本10.0以上,10.0以下的没有确认过)
License(要求CANoe PRO,带Option Ethernet)
Python(版本没有特殊要求,能用socket就行,本文使用Python 3.8)
服务器端服务器端的建立比较简单。关于socket的内容这里就不进行说明了,网上相关资料很多,有兴趣的可以自己去查一查。
import socket
def main():
ip_port = ('127.0.0.1', 2022)
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # udp协议
server.bind(ip_port)
print('Bind UDP on 127.0.0.1:2022')
while Ture:
data, client_addr = server.recvfrom(BUFSIZE)
print('server收到的CANoe数据', data)
reply = "get over"
server.sendto(bytes(str(reply), encoding='utf-8'), client_addr)
if __name__ == '__main__':
main()
print('程序结束')
服务器端建立完成后保持运行即可,等待客户端发送数据后做出回应。
客户端在CANoe搭建客户端要相对复杂一点,这里我们一步一步来。
首先,我们需要新建一个txt文件,内容如下
includes
{
}
variables
{
UdpSocket gSocket;
char gRxBuffer[1500];
dword Server;
dword Client;
char client_char[16] = "127.0.0.1";
char server_char[16] = "127.0.0.1";
dword ClientPort = 2021;
dword ServerPort = 2022;
}
on start
{
Client = ipGetAddressAsNumber(client_char);
Server = ipGetAddressAsNumber(server_char);
gSocket = UdpSocket::Open( Client , ClientPort );
if (IpGetLastError() != 0)
{
// if UdpSocket::Open fails, we print a message to the write window
write( "<%BASE_FILE_NAME%> UdpSocket::Open failed with result %d", IpGetLastError() );
}
gSocket.ReceiveFrom( gRxBuffer, elcount(gRxBuffer) );
}
on preStop
{
gSocket.Close();
}
on key 's'
{
char text[200] = "hello world";
gSocket.SendTo( Server,ServerPort,text,strlen(text) );
}
//此处声明了通过键盘按键s触发客户端向服务器端发送数据
void OnUdpReceiveFrom( dword socket, long result, IP_Endpoint remoteEndpoint, char buffer[], dword size)
{
write(buffer);
gSocket.ReceiveFrom( gRxBuffer, elcount(gRxBuffer) );
}
将该文件拓展名改为.can,并保存。
然后,打开CANoe(要有以太网License,Demo的是无法使用本文方法与外界信息交互的),从模板库新建一个以太网工程文件
建立后的界面应如图所示(各版本界面可能不一样)
进入Simulation界面
调出Simulation Setup窗口
右键单击窗口内的拓扑线,并选择插入一个网络节点
编辑网络节点并选择前文中建立的can文件,打开,确认编译正常
返回CANoe,选择TCP/IP Stack设置并将插入的节点设置为使用操作系统的网络
点击运行工程,并按下键盘上的‘s’键(此处已在can文件中进行说明,请自行查阅)
可以看到,write界面打印出了从服务器端收到的数据。
注意事项不知道为啥,一开始用专业版的Windows11做CANoe与外界信号交互的时候一直报错,后来换成家庭中文版的就正常了。
另外,服务器端和客户端的ip地址只能使用127.0.0.1作为本地测试地址,其余地址是无法进行通信的。



