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

📄 rytestdlg.cpp

📁 MODBUS TCP的通讯管理机程序,用以和组态软件进行数据接口!
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// RYTestDlg.cpp : implementation file

#include "stdafx.h"
#include "RYTest.h"
#include "RYTestDlg.h"
#include "ceddk.h"
#pragma comment(lib,"ceddk.lib")
#include <windows.h>
#include <commctrl.h>
#include <Afxwin.h>
#include <Afxmt.h>
#include <Winsock2.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

BYTE count[8]={0,0,0,0,0,0,0,0};
BYTE watch[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

static BYTE	crc_t1[]=
{
	0x00,0x00,0xC1,0xC0,0x81,0xC1,0x40,0x01,0x01,0xC3,0xC0,0x03,0x80,0x02,0x41,0xC2,
	0x01,0xC6,0xC0,0x06,0x80,0x07,0x41,0xC7,0x00,0x05,0xC1,0xC5,0x81,0xC4,0x40,0x04
};
static BYTE	crc_t2[]=
{
	0x00,0x00,0x01,0xCC,0x01,0xD8,0x00,0x14,0x01,0xF0,0x00,0x3C,0x00,0x28,0x01,0xE4,
	0x01,0xA0,0x00,0x6C,0x00,0x78,0x01,0xB4,0x00,0x50,0x01,0x9C,0x01,0x88,0x00,0x44
};

#define PORT1 502
#define PORT2 1028
//#define PORT3 1026
#define DEST_IP_ADDR1 "192.168.1.27"
#define DEST_IP_ADDR2 "192.168.0.3"
#define DEST_IP_ADDR3 "192.168.1.26"

HANDLE  m_hPort1=INVALID_HANDLE_VALUE,m_hPort2=INVALID_HANDLE_VALUE,
        m_hPort3=INVALID_HANDLE_VALUE,m_hPort7=INVALID_HANDLE_VALUE,
		m_hPort4=INVALID_HANDLE_VALUE,m_hPort5=INVALID_HANDLE_VALUE;
CWinThread *hCOM1Thread,*hCOM2Thread,*hCOM3Thread,*hCOM7Thread,*hCOM4Thread,*hCOM5Thread,
           *TCPSlave1,*Rys,*Ryr,*Monitor;

UINT COM1Thread(LPVOID pArg);
UINT COM2Thread(LPVOID pArg);
UINT COM3Thread(LPVOID pArg);
UINT COM7Thread(LPVOID pArg);
UINT COM4Thread(LPVOID pArg);
UINT COM5Thread(LPVOID pArg);

UINT MBTCPSlaveThread1(LPVOID pArg);
UINT MonitorThread(LPVOID pArg);
UINT RySThread(LPVOID pArg);
UINT RyRThread(LPVOID pArg);

DWORD WINAPI send1(LPVOID pArg);
DWORD WINAPI send2(LPVOID pArg);
DWORD WINAPI send3(LPVOID pArg);
DWORD WINAPI send4(LPVOID pArg);
DWORD WINAPI send5(LPVOID pArg);

DWORD WLDCRC(BYTE *pBuffer,int nSize);
DWORD CRC16(unsigned char *codebuf,int len);
void watdog(unsigned char a);

SOCKET newSocket1=INVALID_SOCKET,newSocket2=INVALID_SOCKET,
       newSocket3=INVALID_SOCKET,newSocket4=INVALID_SOCKET,newSocket5=INVALID_SOCKET;
HANDLE hsend1,hsend2,hsend3,hsend4,hsend5;

CMutex grc2041(FALSE,NULL),grc2042(FALSE,NULL),mmpr(FALSE,NULL),mlpr(FALSE,NULL),pt(FALSE,NULL),
  lsa1145(FALSE,NULL),lsa1146(FALSE,NULL),dev(FALSE,NULL),ejw2000(FALSE,NULL),chymlx(FALSE,NULL);

unsigned char COM1Send[2][900]={{0x00,0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x00,0X00}};
unsigned char COM2Send[2][900]={{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}};
unsigned char COM3Send[2][900]={{0x00,0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x00,0X00}};
unsigned char COM7Send[40]={0x00,0x00,0x00,0x00,0x00};
unsigned char COM4Send[2][900]={{0x00,0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x00,0X00}};
unsigned char COM5Send[2][900]={{0x00,0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x00,0x00}};
BYTE serflag[220]={0x00,0xaa,0x00};

BOOL COM1flag,COM2flag,COM3flag,COM7flag,COM4flag,COM5flag,COM6flag,COM8flag,SOCKflag,send1flag,
     send2flag,send3flag,send4flag,send5flag,send6flag,Rysflag,Ryrflag,Monitorflag,sendflag,
	 revflag;

unsigned char SingalRead(ULONG Addr,unsigned char b);
void InitCol();
void FlashCol(unsigned char PI,unsigned char num);
//void FlashCol2(unsigned char PI,unsigned char num);
unsigned char STATUS=0xFF,STATUS2=0xFF;
unsigned char time[10],DI[2];
/////////////////////////////////////////////////////////////////////////////
// CRYTestDlg dialog

CRYTestDlg::CRYTestDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CRYTestDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CRYTestDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CRYTestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CRYTestDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CRYTestDlg, CDialog)
	//{{AFX_MSG_MAP(CRYTestDlg)
	ON_BN_CLICKED(IDC_BUTTON1, OnSTART)
	ON_BN_CLICKED(IDC_BUTTON2, OnSTOP)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRYTestDlg message handlers

BOOL CRYTestDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	CenterWindow(GetDesktopWindow());	// center to the hpc screen

	// TODO: Add extra initialization here

	//初始化serflag标志数组
	serflag[8]=0,serflag[9]=0x14;    //通信服务器正常工作时钟信号
    serflag[40]=0,serflag[41]=0x02;   //控制器当前使用通信以太网口数量
    serflag[42]=0,serflag[43]=0x06;  //控制器当前使用串口数量
	
	serflag[44]=0,serflag[45]=0x02;  //串口1下挂设备数量
	serflag[46]=0,serflag[47]=0x00;  //串口1下挂设备通信波特率,0=4800,1=9600,2=19600,3=39200,4=78400,5=115.2K 6=356.2K
    serflag[48]=0,serflag[49]=0x01;  //串口1下最多允许通信出错数量
	serflag[50]=0,serflag[51]=0x02;  //串口2下挂设备数量
	serflag[52]=0,serflag[53]=0x01;  //串口2下挂设备通信波特率,0=4800,1=9600,2=19600,3=39200,4=78400,5=115.2K 6=356.2K
    serflag[54]=0,serflag[55]=0x01;  //串口2下最多允许通信出错数量
	serflag[56]=0,serflag[57]=0x02;  //串口3下挂设备数量
	serflag[58]=0,serflag[59]=0x01;  //串口3下挂设备通信波特率,0=4800,1=9600,2=19600,3=39200,4=78400,5=115.2K 6=356.2K
    serflag[60]=0,serflag[61]=0x01;  //串口3下最多允许通信出错数量
	serflag[62]=0,serflag[63]=0x01;  //串口4下挂设备数量
	serflag[64]=0,serflag[65]=0x01;  //串口4下挂设备通信波特率,0=4800,1=9600,2=19600,3=39200,4=78400,5=115.2K 6=356.2K
    serflag[66]=0,serflag[67]=0x01;  //串口4下最多允许通信出错数量
	serflag[68]=0,serflag[69]=0x01;  //串口5下挂设备数量
	serflag[70]=0,serflag[71]=0x01;  //串口5下挂设备通信波特率,0=4800,1=9600,2=19600,3=39200,4=78400,5=115.2K 6=356.2K
    serflag[72]=0,serflag[73]=0x01;  //串口5下最多允许通信出错数量
	serflag[74]=0,serflag[75]=0x00;  //串口6下挂设备数量
	serflag[76]=0,serflag[77]=0x00;  //串口6下挂设备通信波特率,0=4800,1=9600,2=19600,3=39200,4=78400,5=115.2K 6=356.2K
    serflag[78]=0,serflag[79]=0x01;  //串口6下最多允许通信出错数量
	serflag[80]=0,serflag[81]=0x02;  //串口7下挂设备数量
	serflag[82]=0,serflag[83]=1200;  //串口7下挂设备通信波特率,0=4800,1=9600,2=19600,3=39200,4=78400,5=115.2K 6=356.2K
    serflag[84]=0,serflag[85]=0x14;  //串口7下最多允许通信出错数量
	serflag[86]=0,serflag[87]=0x02;  //串口8下挂设备数量
	serflag[88]=0,serflag[89]=0x00;  //串口8下挂设备通信波特率,0=4800,1=9600,2=19600,3=39200,4=78400,5=115.2K 6=356.2K
    serflag[90]=0,serflag[91]=0x00;  //串口8下最多允许通信出错数量

	
	InitCol();
     
	if(serflag[1]=0xaa)
	{
	    //读取抢占式DI信号
		SingalRead(0xDE010,5);
	    if(DI[0]==1)
		{
		   SingalRead(0xDE020,1);   //写DO信号告诉对方已抢权
		   serflag[3]=0x00;
		   serflag[5]=0x03;
		   LPVOID COM1hWnd=NULL,COM2hWnd=NULL,COM3hWnd=NULL,COM7hWnd=NULL,COM4hWnd=NULL,
		       COM5hWnd=NULL,MBTCPSlave1Wnd=NULL,RyshWnd=NULL,MonitorhWnd=NULL;
	        COM1flag=TRUE,COM2flag=TRUE,COM3flag=TRUE,COM5flag=TRUE,COM4flag=TRUE;
	        COM7flag=TRUE,COM8flag=TRUE;
	        send1flag=TRUE,send2flag=TRUE;
	        SOCKflag=1,Rysflag=1,Monitorflag=1,sendflag=1;
	
	        hCOM1Thread=AfxBeginThread(COM1Thread,COM1hWnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
	        hCOM2Thread=AfxBeginThread(COM2Thread,COM2hWnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
	        hCOM3Thread=AfxBeginThread(COM3Thread,COM3hWnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
            hCOM7Thread=AfxBeginThread(COM7Thread,COM7hWnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
	        hCOM4Thread=AfxBeginThread(COM4Thread,COM4hWnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
	        hCOM5Thread=AfxBeginThread(COM5Thread,COM5hWnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
	        TCPSlave1=AfxBeginThread(MBTCPSlaveThread1,MBTCPSlave1Wnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
			Sleep(8000);
	        Rys=AfxBeginThread(RySThread,RyshWnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
	        Monitor=AfxBeginThread(MonitorThread,MonitorhWnd,THREAD_PRIORITY_BELOW_NORMAL,0,0,NULL);
			SingalRead(0xDE021,1);   //程序正常运行
		}

	  else if(DI[0]==0)
		{
		   serflag[3]=0xaa;
		   serflag[5]=0x04;
		   LPVOID MBTCPSlave1Wnd=NULL,RyrhWnd=NULL;
		   SOCKflag=1,Ryrflag=1,revflag=1;
		   
		   Ryr=AfxBeginThread(RyRThread,RyrhWnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
		   Sleep(1000);
		   TCPSlave1=AfxBeginThread(MBTCPSlaveThread1,MBTCPSlave1Wnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
		}  
	}

	else if(serflag[1]=0x00)
	{
		LPVOID COM1hWnd=NULL,COM2hWnd=NULL,COM3hWnd=NULL,COM7hWnd=NULL,COM4hWnd=NULL,
		       COM5hWnd=NULL,MBTCPSlave1Wnd=NULL,RyshWnd=NULL,MonitorhWnd=NULL;
	    COM1flag=TRUE,COM2flag=TRUE,COM3flag=TRUE,COM5flag=TRUE,COM4flag=TRUE;
	    COM7flag=TRUE,COM8flag=TRUE;
	    //send1flag=TRUE,send2flag=TRUE;
	    SOCKflag=1,Rysflag=1,Monitorflag=1,sendflag=1;
	
	    hCOM1Thread=AfxBeginThread(COM1Thread,COM1hWnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
	    hCOM2Thread=AfxBeginThread(COM2Thread,COM2hWnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
	    hCOM3Thread=AfxBeginThread(COM3Thread,COM3hWnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
        hCOM7Thread=AfxBeginThread(COM7Thread,COM7hWnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
	    hCOM4Thread=AfxBeginThread(COM4Thread,COM4hWnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
	    hCOM5Thread=AfxBeginThread(COM5Thread,COM5hWnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
	    TCPSlave1=AfxBeginThread(MBTCPSlaveThread1,MBTCPSlave1Wnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
		//此监视线程同冗余时的监视线程不完全一样
	    Monitor=AfxBeginThread(MonitorThread,MonitorhWnd,THREAD_PRIORITY_NORMAL,0,0,NULL);  
	}
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CRYTestDlg::OnSTART() 
{
	// TODO: Add your control notification handler code here
}

void CRYTestDlg::OnSTOP() 
{
	// TODO: Add your control notification handler code here
    COM1flag=0,COM2flag=0,COM3flag=0,COM5flag=0,COM4flag=0;
	COM7flag=0,COM8flag=0,send1flag=0,send2flag=0;
	send3flag=0,send4flag=0,send5flag=0,send6flag=0;
	SOCKflag=0,Rysflag=0,Monitorflag=0,Ryrflag=0,sendflag=0;
	revflag=0;   
}

UINT MonitorThread(LPVOID pArg)
{
    BYTE num[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
	BYTE l1,l2,l3,l4,l5,l6;
    DWORD LpExit[8];
    Sleep(8000);

	while(Monitorflag)
	{
	   //Sleep(90000);
	  // watdog(0x04);

       /*if(watch[0]==count[0])
	   {
           num[0]++;

           if(num[0]>=3)
		   {
			   //测试通过
               GetExitCodeThread(hCOM1Thread->m_hThread,&LpExit[0]);
			   TerminateThread(hCOM1Thread->m_hThread,LpExit[0]);
			   //CloseHandle(m_hPort1);
			   hCOM1Thread->m_hThread=NULL;
			   //m_hPort1=NULL;

			   //写DO信号
               Sleep(1000);
			   if(hCOM1Thread->m_hThread==NULL)
			   {
                   LPVOID COM1hWnd=NULL;
                   hCOM1Thread=AfxBeginThread(COM1Thread,COM1hWnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
			   }
		   }
	   }
	   else num[0]=0;

       if(watch[1]==count[1])
	   {
            num[1]++;

            if(num[1]>=3)
			{
                GetExitCodeThread(hCOM2Thread->m_hThread,&LpExit[1]);
                TerminateThread(hCOM2Thread->m_hThread,LpExit[1]);
                hCOM2Thread->m_hThread=NULL;

				//写DO信号
                Sleep(1000);
				if(hCOM2Thread->m_hThread==NULL)
				{
					LPVOID COM2hWnd=NULL;
                    hCOM2Thread=AfxBeginThread(COM2Thread,COM2hWnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
				}
			}
	   }
	   else num[1]=0;

       if(watch[2]==count[2])
	   {
            num[2]++;

            if(num[2]>=3)
			{
                GetExitCodeThread(hCOM3Thread->m_hThread,&LpExit[2]);
                TerminateThread(hCOM3Thread->m_hThread,LpExit[2]);
				hCOM3Thread->m_hThread=NULL;

				//写DO信号
                Sleep(1000);
				if(hCOM3Thread->m_hThread==NULL)
				{
					LPVOID COM3hWnd=NULL;
                    hCOM3Thread=AfxBeginThread(COM3Thread,COM3hWnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
				}
			}
	   }
	   else num[2]=0;

      if(watch[3]==count[3])
	  {
           num[3]++;

           if(num[3]>=3)
		   {
              GetExitCodeThread(hCOM7Thread->m_hThread,&LpExit[3]);
              TerminateThread(hCOM7Thread->m_hThread,LpExit[3]);
              hCOM7Thread->m_hThread=NULL;

			  //写DO信号
              Sleep(1000);
			  if(hCOM7Thread->m_hThread==NULL)
			  {
				  LPVOID COM7hWnd=NULL;
                  hCOM7Thread=AfxBeginThread(COM7Thread,COM7hWnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
			  }
		   }
	  }
	  else num[3]=0;

      if(watch[4]==count[4])
	  {
          num[4]++;

          if(num[4]>=3)
		  {
              GetExitCodeThread(hCOM4Thread->m_hThread,&LpExit[4]);
              TerminateThread(hCOM4Thread->m_hThread,LpExit[4]);
			  hCOM4Thread->m_hThread=NULL;

			  //写DO信号
              Sleep(1000);
			  if(hCOM4Thread->m_hThread==NULL)
			  {
				  LPVOID COM4hWnd=NULL;
                  hCOM4Thread=AfxBeginThread(COM4Thread,COM4hWnd,THREAD_PRIORITY_NORMAL,0,0,NULL);
			  }
		  }
	  }
	  else num[4]=0;

      if(watch[5]==count[5])
	  {
          num[5]++;

         if(num[5]>=3)
		 {
             GetExitCodeThread(hCOM5Thread->m_hThread,&LpExit[5]);

⌨️ 快捷键说明

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