⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 achilles.cpp

📁 读MODBUS的动态链接库读 MODBUS的动态链接库读 MODBUS的动态链接库读MODBUS的动态链接库
💻 CPP
字号:
// ACHILLES.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "ACHILLES.h"
#define EXPORT extern "C" __declspec(dllexport)

unsigned char outstr[128];      //通信命令输出缓冲区  
unsigned char instr[128];		//通信返回数据缓冲区
HANDLE comm1;               	//串行口标识句柄
DCB dcb;                       	//串口设置数据控制
COMMTIMEOUTS cto={0,2,5,2,5}; 	//通信延迟参数
COMSTAT cst;                   	//通信参数
DWORD em;						//通信错误状态


BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    return TRUE;
}

int __stdcall Add(int a,int b)
{	int c;
	c = a + b;
	return c;
}

void __stdcall OpenCom(unsigned char ComNo)
{
	//串行口初始化
	if(ComNo==1)
		comm1=CreateFile("COM1",GENERIC_READ+GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,NULL,NULL);
	else
		comm1=CreateFile("COM2",GENERIC_READ+GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,NULL,NULL);

	GetCommState(comm1,&dcb);
	BuildCommDCB("9600,n,8,1",&dcb);
	SetCommState(comm1,&dcb);
	SetupComm(comm1,128,128);
	SetCommTimeouts(comm1,&cto);

}

bool __stdcall ReadDev(unsigned char DevAddr,unsigned int *RecBuf)
{   
	int value;
	unsigned long wn=0,rn=0;		//辅助变量
	unsigned char i,j; 				//辅助变量

	for(i=0;i<128;i++)
	{	
		outstr[i]=0;
		instr[i]=0;
	}	
	
	outstr[0]=DevAddr;			//从机地址,0地址为广播
	outstr[1]=0x3;				//读出命令
	outstr[2]=0x0;				//读出寄存器地址
	outstr[3]=0x10;
	outstr[4]=0;				//读出寄存器数量
	outstr[5]=8;

	//以下为CRC计算
	wn=0xffff;
    for(i=0;i<6;i++)
    {	wn ^= outstr[i];
        for(j=0;j<8;j++)
        {	if(wn&0x1) 
				wn = (wn>>1)^0xa001;
            else 
				wn = wn>>1;
		}
	}

	outstr[i] = (unsigned char)(wn&0xff);
    outstr[i+1] = (unsigned char)((wn>>8)&0xff);

    WriteFile(comm1,outstr,8,&wn,NULL);
	FlushFileBuffers(comm1);
	Sleep(50);
	ReadFile(comm1,instr,64,&rn,NULL);
	ClearCommError(comm1,&em,&cst);		//可由em参数判断是否有底层错误
	PurgeComm(comm1,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
    
	//检查返回字节数和CRC码,若不正确,数据将丢弃
    if(rn == 21)
    {	//检查CRC校验码
        wn = 0xffff;
        for(i=0;i<19;i++)
		{	wn^=instr[i];
			for(j=0;j<8;j++)
			{	if(wn&0x1) 
					wn = (wn>>1)^0xa001;
                else 
					wn = wn>>1;
            }
        }
        if(instr[i]==(wn&0xff) && instr[i+1]==((wn>>8)&0xff))
        {	for(i=0;i<8;i++)
            {   value = instr[3+2*i];
                value = value<<8;
                value += instr[3+2*i+1];
                *(RecBuf+i) = (value>4095?4095:value);
            }      
			return true;
		}
	}
	return false;	
}
void __stdcall CloseCom(unsigned char ComNo)
{
	CloseHandle(comm1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -