STS 的共享内存过程(待充分理解)

//初始化共享内存
	CSupportSystemDoc* pSuptDoc;
	CSingleDocTemplate* pDocTmpl;
	pDocTmpl = ((CSupportSystemApp*)AfxGetApp())->pDocTemplate;
	POSITION posDoc= pDocTmpl->GetFirstDocPosition();
	while(NULL!=posDoc)
	{
		pSuptDoc = (CSupportSystemDoc*) pDocTmpl->GetNextDoc(posDoc);
	}
	pSuptDoc->SetUpShareMemory();
//共享内存初始化完毕
#define CARDTYPE_SAMA_AVDV	10	 //SAMA点
BOOL m_bCreateMem;					//是否创建共享内存
unsigned int m_ShareMemoryLength;		//记录共享内存使用长度
//共享内存
#define MAX_SHARELIMIT		40000000// 共享内存最大容量
#define MAX_STRINGLENGTH		0	// 写入共享内存中最大字符串长度
#define CHAR_LENGTH			1	//char长度1
#define FLOAT_LENGTH		4	//float长度4
#define INT_LENGTH			4	//int长度4
#define DOUBLE_LENGTH		8	//double长度8
#define MAX_DELETE_MODULE		20000	//记录存储DelRecordOnLine结构的个数
#define MAX_STRINGLENGTHFORDC	20	//AVDV共享内存中最大字符串长度
//共享内存定义
//1、模块运算共享内存
HANDLE HFileMapOutData;
void *PtrShareMemOutData;
CString ShareMemNameOutData;
//2、AV静态信息所在共享内存名称
HANDLE HFileMapAVMessage;
void *PtrShareMemAVMessage;
CString AVMessage;
//3、DV静态信息所在共享内存名称
HANDLE HFileMapDVMessage;
void *PtrShareMemDVMessage;
CString DVMessage;
//4、AV点的值的指针所在共享内存名称
HANDLE HFileMapAVValuePT;
void *PtrShareMemAVValuePT;
CString AVValuePT;
//5、DV点的值的指针所在共享内存名称
HANDLE HFileMapDVValuePT;
void *PtrShareMemDVValuePT;
CString DVValuePT;
//7、算法库所在的共享内存
HANDLE HFileMapAlg;
void *PtrShareMemAlg;
CString szShareMenAlg;
//8、ECS 输入共享内存
HANDLE HFileMapECSInData;
void *PtrShareMemECSInData;
CString ShareMemNameECSInData;

//7、ECS 输出共享内存
HANDLE HFileMapECSOutData;
void *PtrShareMemECSOutData;
CString ShareMemNameECSOutData;

一、开启模块运算共享内存

//jia所用到的变量
//1、模块运算共享内存
HANDLE HFileMapOutData;
void *PtrShareMemOutData;
CString ShareMemNameOutData;
  void CSupportSystemDoc::SetUpShareMemory()
  {/*jia开启模块运算共享内存*/
    ShareMemNameOutData = "REALTIMEDATA";//jia RealTimeData//CString ShareMemNameOutData;
		  
    HFileMapOutData = CreateFileMapping((HANDLE)0xFFFFFFFF,//因为不是读写文件,所以不需要文件句柄
			  (LPSECURITY_ATTRIBUTES)NULL,//默认安全属性
			  PAGE_READWRITE,//可读写
			  0, //高32位不用
			  MAX_SHARELIMIT, //用低32位,规定共享内存大小
			  ShareMemNameOutData //共享数据的名字
			  );
     		  
    PtrShareMemOutData = (char*)MapViewOfFile(HFileMapOutData,
			  FILE_MAP_ALL_ACCESS,//规定是否可以读写和读写的形式
			   0, 
			   0,
			   MAX_SHARELIMIT//指定映射文件的字节数
			   );
    		  m_bCreateMem = TRUE;
    memset(PtrShareMemOutData,0,MAX_SHARELIMIT);//初始化共享内存
  }

二、向共享内存中载入数据

//jia算法链表中是CLnObj类,CLnObj类继承于CObList
typedef CTypedPtrList<CObList, CLnObj*> CLnObjList; 

//存放所有的obj11111
CLnObjList m_objects;	
	
 
CLnObjList m_CalculateList;//运算时,从总链表中挑出模块组成新的链表
CLnObjList m_tCalculateList;//临时运算链表,用于载入初始条件

CLnObjList QAlgObjList

void CSupportSystemDoc::SetShareMemoryData()
{
	/************************************************************************/
	/* 此函数载入了模块的 状态、 周期、 输出常数输出的状态和值              */
	/************************************************************************/
    
    CLnObjList m_tempList;    //查找条件中未涉及到的模块。//jia运算块的序号和算法名不存在在总算法链表中
	m_tempList.RemoveAll();
 
    char* pPointer;
    POSITION pos = m_objects.GetHeadPosition();
	while (NULL!=pos)
	{
		CLnObj* pObj = m_objects.GetNext(pos);
		POSITION t_pos = m_tCalculateList.GetHeadPosition();
		
		while (NULL!=t_pos)
		{
      
                CLnObj* t_pObj = m_tCalculateList.GetNext(t_pos);
                if ((pObj->Module_Count==t_pObj->Module_Count) //模块的序号,如果其值为0,则为直线;
                    && (pObj->Alg_Fun==t_pObj->Alg_Fun)模块对应算法函数名称
                    && (0!=pObj->Module_Count))//因验收问题改为由模块名赋值
                    //jia判断临时运算链表中的算法是否存在总的算法链表中
                {
                    pObj->Cycles = t_pObj->Cycles;//运算周期倍数
                    int i =0;
                    for ( i = 0;i<t_pObj->inNum;i++)//t_pObj->inNum输入端连线数
                    {
                        pPointer = (char *)PtrShareMemOutData 
				+ pObj->Point //unsigned int Point;//模块在共享内存中的位置
				+ MAX_STRINGLENGTH + INT_LENGTH + INT_LENGTH
				+ (MAX_STRINGLENGTH + CHAR_LENGTH + DOUBLE_LENGTH)*i 
				+ MAX_STRINGLENGTH;
                       ???
                       //引脚i状态//jia char*   InState;//用来保存输入的状态,
                                   //0:正常状态,1:强制状态,2:保持状态;
                                    //该数组在生成模块时分配空间;
                       *((unsigned char*)pPointer) = t_pObj->InState[i];   
                        pPointer += sizeof(unsigned char);
                        
                       //引脚i实时值//jia  CString* pInputName;//模块输入变量名
                       if (t_pObj->pInputName[i] == pObj->pInputName[i])//当点名相同时
                       {
                           //jia double*  InData;//存储输入
                           *((double*)pPointer) = t_pObj->InData[i];
                           pPointer += sizeof(double);
                           pObj->InData[i] = t_pObj->InData[i];//给模块变量赋值
                        }
                        else
                        {
				pPointer += sizeof(double);				
                        }                     
                    }  
                     //将模块的常数写入共享内存
                     for ( i=0;i<t_pObj->cofNum;i++)
    			{
					pPointer = (char *)PtrShareMemOutData 
						+ pObj->Point 
						+ MAX_STRINGLENGTH + INT_LENGTH + INT_LENGTH
						+ (MAX_STRINGLENGTH + CHAR_LENGTH + DOUBLE_LENGTH)*pObj->inNum 
						+ (MAX_STRINGLENGTH + CHAR_LENGTH + DOUBLE_LENGTH)*i
						+ MAX_STRINGLENGTH /*+ 输入组变量 (t_pObj->m_InValue - t_pObj->inNum)*4*/;
					//引脚i状态
					pPointer += sizeof(unsigned char);
					//引脚i实时值
					pPointer += sizeof(double);
    			}
			//将模块的输出写入共享内存
			for ( i=0;i<t_pObj->outNum;i++)
			{
					pPointer = (char *)PtrShareMemOutData 
						+ pObj->Point 
						+ MAX_STRINGLENGTH + INT_LENGTH + INT_LENGTH
						+ (MAX_STRINGLENGTH + CHAR_LENGTH + DOUBLE_LENGTH)*pObj->inNum 
						+ (MAX_STRINGLENGTH + CHAR_LENGTH + DOUBLE_LENGTH)*pObj->cofNum 
						+ (MAX_STRINGLENGTH + CHAR_LENGTH + DOUBLE_LENGTH)*i 
						+ MAX_STRINGLENGTH ;
					//引脚i状态
					*((unsigned char*)pPointer) = t_pObj->OutState[i];
					pPointer += sizeof(unsigned char);
					//引脚i实时值
					if (pObj->pOutputName[i]==t_pObj->pOutputName[i])//当点名相同时
					{
						*((double*)pPointer) = t_pObj->OutData[i];
						pPointer += sizeof(double);
						pObj->OutData[i] = t_pObj->OutData[i];给模块变量赋值
					}
					else{
						pPointer += sizeof(double);
					}
			} 
   		Bfind=TRUE;
                   break;
			}
			
		}
		pPointer=NULL;
		if (Bfind==FALSE&&pObj->Module_Count!=0)
		{
			m_tempList.AddTail(pObj);//找到没有匹配变量的pobj,以便根据连接关系进行重新赋值
		}
		Bfind=FALSE;
    
    }
(第二部分)




}
(第二部分)处理//找到没有匹配变量的m_tempList链表
char *t_Point;
double t_InData;
if (1)
{
	POSITION pos = m_tempList.GetHeadPosition();
	while (NULL!=pos)
	{
		CLnObj* pObj = m_tempList.GetNext(pos);
		int i =0; for ( i = 0;i<pObj->inNum;i++)
		{
		if (0!=pObj->inRect[i])
		{
			t_Point = (char *)PtrShareMemOutData + pObj->m_InPoint[i];  //获取输入变量所在的指针
			t_InData =*(double *)t_Point;                            //获取输入变量的值
			//写入当前模块地址
			t_Point = (char *)PtrShareMemOutData 
				+ pObj->Point 
				+ MAX_STRINGLENGTH + INT_LENGTH + INT_LENGTH 
				+ (MAX_STRINGLENGTH + CHAR_LENGTH + DOUBLE_LENGTH)*i 
				+ MAX_STRINGLENGTH +1;
				*((double*)t_Point) = t_InData;		
		}
		else if (0==pObj->inRect[i] )	//模型没有任何输入,人为给了输入,从共享内存中读入,没有出现组变量
		{
			if (pObj->m_InType[i] == 2 && (pObj->m_InPoint[i]!=0))//黑变量,且
			{
				t_Point = (char *)PtrShareMemOutData + pObj->m_InPoint[i];
				t_InData =(*(double *)t_Point);
				t_Point = (char *)PtrShareMemOutData 
					+ pObj->Point 
					+ MAX_STRINGLENGTH + INT_LENGTH + INT_LENGTH 
					+ (MAX_STRINGLENGTH + CHAR_LENGTH + DOUBLE_LENGTH)*i 
					+ MAX_STRINGLENGTH +1;
					*((double*)t_Point) = t_InData;
			}
			else 
			{
				t_Point = (char *)PtrShareMemOutData+ pObj->Point 
					+ MAX_STRINGLENGTH + INT_LENGTH + INT_LENGTH 
					+ (MAX_STRINGLENGTH + CHAR_LENGTH + DOUBLE_LENGTH)*i 
					+ MAX_STRINGLENGTH + 1;
				if (pObj->pInputName[i]=="")
					{
						*(double *)t_Point=0;
					}	//写入  DCS点					
			}
		}
				
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值