Loading

VSMModel-TCP

VSMModel-TCP

Proteus中创建自定义元件,调用dll文件实现tcp-client,向指定ip地址发送数据

开发环境

  • windows11

  • proteus 8.15

  • visual studio 2022 community

    默认安装即可,理论上不需要安装额外组件

关于VSM

  • Proteus VSM 仿真模型

    在使用Proteus仿真单片机系统的过程中,经常找不到所需的元件,这就需要自己编写。Proteus VSM的一个主要特色是使用基于DLL组件模型的可扩展性。这些模型分为两类:电气模型(Electrical Model)和绘图模型(Graphical Model)。电气模型实现元件的电气特性,按规定的时序接收数据和输出数据;绘图模型实现仿真时与用户的交互,例如LCD的显示。一个元件可以只实现电气模型,也可以都实现电气和绘图模型。

    Proteus为VSM模型提供了一些C++抽象类接口,用户创建元件时需要在DLL中实现相应的抽象类。

DLL

  • TCP协议的基本知识

  • 想改ip直接看DismModel.cpp

    image-20230809183024283

自建元器件

Proteus元器件

设计一个7输入的元器件

  1. 先画7个按键,对应7个输入

    image-20230911210738212

  2. 左侧工具栏主要用到这两个,设计完成后,选中右键make device,后续如图所示

    image-20230911210916576

    image-20230911213822482

    image-20230911213931441

    image-20230911214322725

    image-20230911214432851

程序

程序为在检测到按键按下后,通过TCP/IP协议向服务端发送信息

主要关注DsimModel.hDsimModel.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;
};

image-20230911220034903

  • 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();
	
}

image-20230911215828172

image-20230911220111901

如何操作

准备工作都做完了,正式开始操作

  1. 打开dll工程,在Visual Studio中选择x86,编译生成dll文件,放到proteus工程同级目录下

image-20230809182103740

  1. 准备好VSMModel.dll后,打开arduinouno.pdsprj,运行仿真

    image-20230809182928848

  2. python3运行tcp_server.py,任意点击仿真中的按键

    image-20230809183921128

源码

https://github.com/AmorFati-coder/VSMModel-TCP

其他参考资料

https://github.com/MockbaTheBorg/VSMModel

posted @ 2023-09-11 13:28  AmorFati404  阅读(89)  评论(0)    收藏  举报