概述
Linux下的SharedMemory有多种共享内存的操作方式。
Codesys的SharedMemory 是 POSIX 方式。简而言之是,在/dev/shm生成一个文件(文件名称为key值),来供其他进程访问。
而Qt的SharedMemory则提供2种方式, System V 和 POSIX 。 其中如果没有在Configure设置POSIX,一般默认是System V。
因此,默认情况下,qt的QSharedMemory访问不了Codesys的SharedMemory。因为共享内存的方式不一样。
既然 POSIX 方式 就是在/dev/shm生成文件,那qt想要访问Codesys的SharedMemory,那就Qfile去操作Codesys存在/dev/shm的文件即可。
Codesys的ST代码
(*
#@Copyright:
#@License:
#@Birth: created by Along on 2023-08-12
#@Content: Shm_PRG-共享内存读写
#@Version: 0.0.1
#@Revision: last revised by Along on 2023-08-12
#@brief 共享内存读写
#@output
*)
PROGRAM Shm_PRG
VAR
handle_shmm_create :SysShm.RTS_IEC_HANDLE; //create函数输出的handle
result_shmm_create :SysShm.RTS_IEC_RESULT; //create函数输出的result
result_shmm_write :SysShm.RTS_IEC_RESULT; //write函数输出的result
result_shmm_read :SysShm.RTS_IEC_RESULT; //read函数输出的result
mem_str_key :STRING:='codesys_shm'; //共享内存的key字符串
ui_SharedMemorySizeCreate :UINT; //create反馈的size
info_read :Stru_Info; //共享内存的读取的结构体实例
END_VAR
(*
RTS_IEC_RESULT 的值 是 CmpErrors2 Interfaces Library 的 Errors枚举体.
*)
//获取或打开 共享内存的handle。 开机时创建,后面打开。create函数本身 是创建或打开。
handle_shmm_create := SysSharedMemoryCreate(pszName:= mem_str_key, ulPhysicalAddress:= 0, pulSize:= ADR(ui_SharedMemorySizeCreate), pResult:= ADR(result_shmm_create) );
//共享内存的读函数
SysSharedMemoryRead(
hShm:= handle_shmm_create,
ulOffset:= 0,
pbyData:= ADR(info_read),
ulSize:= glvars.ui_SharedMemorySize,
pResult:= ADR(result_shmm_read)
);
//判断读取共享内存的数据的流向值。
IF info_read.flow = 1 THEN
// info_read.flow = 1 = 上位机程序更新后
//把共享内存的值覆盖自己的info
glvars.info_data := info_read;
//修改内存流向标志位
glvars.info_data.flow := 0;
END_IF
//把改后的值,往内存写入
SysSharedMemoryWrite(
hShm:= handle_shmm_create,
ulOffset:= 0,
pbyData:= ADR(glvars.info_data),
ulSize:= glvars.ui_SharedMemorySize,
pResult:= ADR(result_shmm_write)
);
//关闭hande,释放
SysSharedMemoryClose(hShm:= handle_shmm_create);
命令行截图