首页 > 代码库 > 草稿:SCADA全局底层框架架构

草稿:SCADA全局底层框架架构

一:全局基于单文档MFC程序开发。

 

二:全局每个功能模块之间完全隔离, 模块之间的数据交流必须使用主板模板。

 

三:每个功能块全部都自己的线程,除了PLC功能块 其他都是窗口线程

 

四:各个功能命名的前缀依次是:

硬件功能模组:CGszBoard

HMI模组:CGszHmi

CCD模组:CGszCcd

PLC模组:CGszPlc

运动模组:CGszMotion

数据库模组:CGszDataBase

通讯模组:CGszCommunication

主板总线模组:CGszMainDataBus

×××××××××××××××××××××××××××××

五:在App的头文件里面声明 线程函数依次是:

硬件功能模组:static UINT Scada_GszBoard(LPVOID pParam);  

HMI模组:static UINT Scada_GszHmi(LPVOID pParam)

CCD模组:static UINT Scada_GszCcd(LPVOID pParam)

PLC模组:static UINT Scada_GszPlc(LPVOID pParam)

运动模组:static UINT Scada_GszMotion(LPVOID pParam)

数据库模组:static UINT Scada_GszDataBase(LPVOID pParam)

通讯模组:static UINT Scada_GszCommunication(LPVOID pParam)

主板总线模组:该模组不需要线程

 

六:在App的实现文件(就是CPP)文件里去实现这些七个函数。

 

七:上述线程分为两类一类是有脸的 一类是无脸的。使用不同全局函数 将上述函数定义为线程函数

首先有脸线程函数的定义方式:

CWinThread* AfxBeginThread(  CRuntimeClass* pThreadClass,//从CWinThread派生的RUNTIME_CLASS类;  intnPriority=THREAD_PRIORITY_NORMAL,//线程优先级,如果为0,则与创建该线程的线程相同;  UINT nStackSize=0,//线程的堆栈大小,如果为0,则与创建该线程的线程相同;  DWORD dwCreateFlags=0,//一个创建标识,如果是CREATE_SUSPENDED,则在悬挂状态创建线程,在线程创建后线程挂起,否则线程在创建后开始线程的执行。  LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL//线程的安全属性,NT下有用。);

 

然后是无脸函数的定义方式:

CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,//指向工作者线程的执行函数的指针,线程函数原型必须声明如下: UINTExecutingFunction(LPVOID pParam);LPVOID pParam,//传递给线程函数的一个32位参数,执行函数将用某种方式解释该值。它可以是数值,或是指向一个结构的指针,甚至可以被忽略;nPriority=THREAD_PRIORITY_NORMAL,//线程的优先级。如果为0,则线程与其父线程具有相同的优先级;UINTnStackSize=0,//线程为自己分配堆栈的大小,其单位为字节。如果nStackSize被设为0,则线程的堆栈被设置成与父线程堆栈相同大小;DWORDdwCreateFlags=0,//如果为0,则线程在创建后立刻开始执行。如果为CREATE_SUSPEND,则线程在创建后立刻被挂起;LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL//线程的安全属性指针,一般为NULL;);

  

八:程序设计过程会使用到很多库, 配置编译器使编译器可以兼容这些库

 

九:在各个模块里面书写函数。  在线程函数里面实例化他们。套用个文词吧。画龙点睛。。。 定义了那么多类 ,最后如果不去实例化 都是扯了。。

实例化就是画龙点睛。

 

草稿:SCADA全局底层框架架构