VSMModel-TCP
VSMModel-TCP
Proteus中创建自定义元件,调用dll文件实现tcp-client,向指定ip地址发送数据
开发环境
-
windows11
-
proteus 8.15
-
visual studio 2022 community
默认安装即可,理论上不需要安装额外组件
关于VSM
-
在使用Proteus仿真单片机系统的过程中,经常找不到所需的元件,这就需要自己编写。Proteus VSM的一个主要特色是使用基于DLL组件模型的可扩展性。这些模型分为两类:电气模型(Electrical Model)和绘图模型(Graphical Model)。电气模型实现元件的电气特性,按规定的时序接收数据和输出数据;绘图模型实现仿真时与用户的交互,例如LCD的显示。一个元件可以只实现电气模型,也可以都实现电气和绘图模型。
Proteus为VSM模型提供了一些C++抽象类接口,用户创建元件时需要在DLL中实现相应的抽象类。
DLL
-
TCP协议的基本知识
-
三次握手 建立连接
-
四次挥手 释放连接
-
-
想改ip直接看
DismModel.cpp
自建元器件
Proteus元器件
设计一个7输入的元器件
-
先画7个按键,对应7个输入
-
左侧工具栏主要用到这两个,设计完成后,选中右键make device,后续如图所示
程序
程序为在检测到按键按下后,通过TCP/IP协议向服务端发送信息
主要关注DsimModel.h
和DsimModel.cpp
两个文件
DsimModel.h
class DsimModel : public IDSIMMODEL
{
public:
INT isdigital (CHAR *pinname);
VOID setup (IINSTANCE *inst, IDSIMCKT *dsim);
VOID runctrl (RUNMODES mode);
VOID actuate (REALTIME time, ACTIVESTATE newstate);
BOOL indicate (REALTIME time, ACTIVEDATA *data);
VOID simulate (ABSTIME time, DSIMMODES mode);
VOID callback (ABSTIME time, EVENTID eventid);
private:
IINSTANCE *inst;
IDSIMCKT *ckt;
IDSIMPIN *pin1, *pin2, *pin3, *pin4, *pin5, *pin6, *pin7;
};
DsimModel.cpp
INT DsimModel::isdigital (CHAR *pinname)
{
return TRUE; // Indicates this is a digital model
}
//初始化
VOID DsimModel::setup (IINSTANCE *instance, IDSIMCKT *dsimckt)
{
inst = instance;
ckt = dsimckt;
//对应你设计元件时填写的值
pin1 = inst->getdsimpin("Pin1", true);
pin2 = inst->getdsimpin("Pin2", true);
pin3 = inst->getdsimpin("Pin3", true);
pin4 = inst->getdsimpin("Pin4", true);
pin5 = inst->getdsimpin("Pin5", true);
pin6 = inst->getdsimpin("Pin6", true);
pin7 = inst->getdsimpin("Pin7", true);
}
//业务逻辑
VOID DsimModel::simulate(ABSTIME time, DSIMMODES mode) {
WORD wVersion = MAKEWORD(2, 2);
WSADATA dwVersionInfo;
int status = WSAStartup(wVersion, &dwVersionInfo);
if (status != 0)
{
WSACleanup();
}
if (HIBYTE(dwVersionInfo.wVersion) != 2 || LOBYTE(dwVersionInfo.wVersion) != 2)
{
WSACleanup();
}
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.s_addr = inet_addr("192.168.3.22");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6800);
//三次握手建立通信
connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
if (ishigh(pin1->istate()))
{
sendData(sockClient, "w");
}
else if (ishigh(pin2->istate()))
{
sendData(sockClient, "s");
}
else if (ishigh(pin3->istate()))
{
sendData(sockClient, "a");
}
else if (ishigh(pin4->istate()))
{
sendData(sockClient, "d");
}
else if (ishigh(pin5->istate()))
{
sendData(sockClient, "q");
}
else if (ishigh(pin6->istate()))
{
sendData(sockClient, "e");
}
else if (ishigh(pin7->istate()))
{
sendData(sockClient, "r");
}
else {
sendData(sockClient, "cancel");
}
closesocket(sockClient);
WSACleanup();
}
如何操作
准备工作都做完了,正式开始操作
- 打开dll工程,在Visual Studio中选择x86,编译生成dll文件,放到proteus工程同级目录下
-
准备好
VSMModel.dll
后,打开arduinouno.pdsprj
,运行仿真 -
python3运行
tcp_server.py
,任意点击仿真中的按键
源码
https://github.com/AmorFati-coder/VSMModel-TCP