C++代码审阅–ice104协议从站(4)

IEC104NASlaveDlg.h文件定义了一个C++对话框类,用于实现IEC104协议的从站功能。类中包含了启动和停止监听的按钮、接收和发送列表框等界面元素,以及相关消息处理函数。文件还涉及了自定义消息、窗口图标、数据传输和网络通信的部分。该代码适用于工业自动化领域的通信应用。
摘要由CSDN通过智能技术生成

代码理解

IEC104NASlaveDlg.h窗口头文件
已注释过内容不再注释,请参考
C++代码审阅–ice104协议从站(1)
C++代码审阅–ice104协议从站(2)
C++代码审阅–ice104协议从站(3)

// IEC104NASlaveDlg.h : header file
//

#if !defined(AFX_IEC104NASLAVEDLG_H__76F8CBDC_BEBC_42FD_920C_759778DCC183__INCLUDED_)
#define AFX_IEC104NASLAVEDLG_H__76F8CBDC_BEBC_42FD_920C_759778DCC183__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000



// #include "Slave104.h"
#include <winsock2.h>
#define WM_MYMESSAGE WM_USER+100  //自定义消息

/
// CIEC104NASlaveDlg dialog
class Slave104;
class CIEC104NASlaveDlg : public CDialog
{
// Construction
public:
	CIEC104NASlaveDlg(CWnd* pParent = NULL);	// standard constructor ,标准构造函数CIEC104NASlaveDlg
	virtual ~CIEC104NASlaveDlg();   //定义析构函数~CIEC104NASlaveDlg

// Dialog Data
	//{{AFX_DATA(CIEC104NASlaveDlg)
	enum { IDD = IDD_IEC104NASLAVE_DIALOG }; //枚举资源视图成员
	CButton	m_startListen; // 启动监听按钮
	CButton	m_stopListen; // 停止监听按钮
	CListBox	m_revList; //接收列表框
	CListBox	m_sendList; //接收列表框
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CIEC104NASlaveDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support  ,定义DoDataExchange函数
	//}}AFX_VIRTUAL

// Implementation
protected:
	HICON m_hIcon;  //窗口图标
	
public:
	void SetButtonState(BOOL state);
	void SetRemainTimeCtrl(int nType,  int nRemainSecond, BOOL isInvalid);
	void SetTimeCtrl(int nType, BOOL isInvalid);
	void MyMemcpy(void *, void *, int len);
	BOOL StartListen();
	Slave104 *slave;
//	static DWORD WINAPI ClientThread(LPVOID lpParam);
//	int GetIp();
//	SOCKET client;
//	sockaddr_in from;
	BYTE YXData[288];  //遥信数组 288
//	BYTE YCData[6000];
	DWORD YMData[20];  //遥脉数组 20
	WORD YCData[2951]; //遥测数组2951

	// Generated message map functions
	//{{AFX_MSG(CIEC104NASlaveDlg)
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	afx_msg void OnButtonStart();
	afx_msg LRESULT OnRevMsg(WPARAM wParam,LPARAM lParam);
	afx_msg void OnButtonDeflectionyx();
	afx_msg void OnButtonSoe();
	afx_msg void OnButton1();
	afx_msg void OnButtonStoplisten();
	afx_msg void OnButtonClearlist();
	afx_msg void OnButtonSavemsg();
	//}}AFX_MSG ,此块定义了一些消息标识
	DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_IEC104NASLAVEDLG_H__76F8CBDC_BEBC_42FD_920C_759778DCC183__INCLUDED_)

文件含义

IEC104NASlaveDlg.h这个文件主要定义了窗口界面里面的一些元素和消息的定义,在IEC104NASlaveDlg.cpp里实现界,可以看下图界面。
在这里插入图片描述
附上dialog所有界面元素属性表

元素名称对象名
启动侦听IDC_BUTTON_START
停止侦听IDC_BUTTON_STTOPLISTEN
不回复启动帧IDC_CHECK_NORESPONSESTART
变位遥信IDC_BUTTON_DEFLECTIONYX
SOEIDC_BUTTON_SOE
SOEIDC_BUTTON1
SOEIDC_BUTTON1
T1起始示例编辑框IDC_TIME_T1
T2起始示例编辑框IDC_TIME_T2
T3起始示例编辑框IDC_TIME_T3
T1剩余示例编辑框IDC_REMAIN_T1
T2剩余示例编辑框IDC_REMAIN_T2
T3剩余示例编辑框IDC_REMAIN_T3
发送数据区IDC_LIST_SENDMSG
接收数据区IDC_LIST_MSG
保存报文IDC_BUTTON_SAVEMSG
清空数据区IDC_BUTTON_CLEARLIST
确定IDOK
取消IDCANCLE

相关基础知识

1.计算机网络中拥塞窗口:CWnd
2.指针:https://www.cnblogs.com/tongye/p/9650573.html
3.构造函数和析构函数:https://www.runoob.com/cplusplus/cpp-constructor-destructor.html
4.自定义消息:MFC自定义消息
5.枚举:https://www.runoob.com/cprogramming/c-enum.html
6.MFC窗口控件C++/MFC-几种常用控件
7.关键字:https://www.runoob.com/w3cnote/cpp-keyword-intro.html
8.MFC函数DoDataExchange:DoDataExchange
9.比特、字节、字:https://blog.csdn.net/qq_43152052/article/details/86751717

# IEC104 Protocol of IEC104 and IEC101 ## by chendajie 2014-2015 ## 电网IEC104/IEC101通信协议 ============================== 隔离协议内容与平台或者硬件相关性,已经在stm32平台和linux平台移植测试通过,可轻松移植到其他平台。 ============================================================================ 队列实现的隔离,目前实现简单的先入先出队列,可根据需求用其他队列算法替换。 移植调用实现: 1.在不同平台下,实现_iec10x结构体的函数指针(利用函数指针实现的接口)。 2.调用RegisterIEC10XMoudle,注册实现的_iec10x接口。 3.创建线程一调用Iex104_Receive管理收包解析。 4.创建线程二调用Iec10x_Scheduled实现出队调度。 5.创建线程三实现状态机Iec104_StateMachine,实现协议状态管理,协议包组包入队。 代码内容 IEC0x目录 iec101.c iec101协议包内容 iec104.c iec104协议包内容 iec10x.c 队列初始化,入队出对实现,队列优先级等相关实现,队列调度实现 PRIO_QUEUE_Iec10x.c 队列具体算法实现 test目录 linux上简单测试代码,仅供参考,作者具体协议应用在stm32上,利用状态机控制数据包入队与出队调度 重要函数: Iec10x_Scheduled:出队调度 IEC10X_Enqueue:入队函数 IEC10X_Dequeue:出队函数 IEC10X_FindQHead:查找最高优先级数据包 IEC10X_XXX:前缀为IEC10X_的函数为各个协议包的组包函数 Iec104_StateMachine: 104协议状态机 Iex104_Receive:收包解析 RegisterIEC10XMoudle:协议模块注册,初始化 重要结构体: 用函数指针实现的移植接口,根据不同平台与硬件特性,选择性实现以下接口 typedef struct _iec10x { char * name; int (* Init)(void); void (* Delay_ms)(uint16_t); void (* CloseLink)(void); void *(* Malloc)(uint8_t NumByte); void (* Free)(void *buffer); uint8_t (* enqueue)(Iec10x_PrioQueue_T *QueueHdr, Iec10x_PrioNode_T *NewNode); Iec10x_PrioNode_T *(* dequeue)(Iec10x_PrioQueue_T * QueueHdr); Iec10x_PrioNode_T *(* FindQHead)(Iec10x_PrioQueue_T * QueueHdr); char (* GetPrio)(void); void (* InitQueue)(Iec10x_PrioQueue_T *PrioQueue); void (* ClearQueue)(Iec10x_PrioQueue_T * QueueHdr); uint8_t (* Send)(int socketfd,char *data,int len); uint32_t (* SetTime)(PCP56Time2a_T time); uint32_t (* GetTime)(PCP56Time2a_T time); int8_t (* GetStationState)(uint16_t Addr, uint8_t DevType); float (* GetStaValue)(uint16_t Addr, uint8_t DevType); uint16_t (* GetLinkAddr)(void); int8_t (* GetInfoNum)(uint8_t *InfoNum, uint8_t DevType); int8_t (* SetConfig)(long Value, uint32_t addr); int8_t (* SaveFirmware)(uint8_t FirmLen, uint8_t *buf,uint32_t FirmwareType, uint32_t Iec10x_Update_SeekAddr); int8_t (* CheckFirmware)(uint32_t FirmwareType, uint32_t TotalLen); int8_t (* UpdateFirmware)(uint32_t FirmwareType); int8_t (* BackoffFirmware)(uint32_t FirmwareType); #ifdef IEC10XLOCK void (* LOCK)(void); void (* UNLOCK)(void); #endif } *PIEC10X_T, IEC10X_T;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值