//初始化共享内存
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点
}
}
}
}