Codesys 使用共享内存 打通通讯
Codesys V3.5 平台 提供了库SysShm,其中包含了共享内存操作的接口函数:
SysSharedMemoryClose;
SysSharedMemoryCreate;
SysSharedMemoryDelete;
SysSharedMemoryGetPointer;
SysSharedMemoryOpen2;
SysSharedMemoryRead;
SysSharedMemoryReadByte;
SysSharedMemoryWrite;
SysSharedMemoryWriteByte;
与其进行共享内存通讯的平台Linux,window;下的编程Demo:
Linux:
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
struct DataExchange {
int i1;
int i2;
};
int main(int argc, char **argv)
{
struct DataExchange *pRead, *pWrite;
char sSharedMemReadName[100] = "_CODESYS_SharedMemoryTest_Write";
char sSharedMemWriteName[100] = "_CODESYS_SharedMemoryTest_Read";
int fdRead = shm_open(sSharedMemReadName, O_CREAT | O_RDWR, S_IRWXU | S_IRWXG);
printf("Shared Memory Read: %s %d\n\n",sSharedMemReadName, fdRead);
ftruncate(fdRead, sizeof(*pRead));
pRead = mmap(0, sizeof(*pRead), PROT_READ | PROT_WRITE, MAP_SHARED, fdRead, 0);
close(fdRead);
int fdWrite = shm_open(sSharedMemWriteName, O_CREAT | O_RDWR, S_IRWXU | S_IRWXG);
printf("Shared Memory Write: %s %d\n\n",sSharedMemWriteName, fdWrite);
ftruncate(fdWrite, sizeof(*pWrite));
pWrite = mmap(0, sizeof(*pWrite), PROT_READ | PROT_WRITE, MAP_SHARED, fdWrite, 0);
close(fdWrite);
do
sleep(1);
printf("pRead->i1: %d pRead->i2: %d pWrite->i1: %d pWrite->i2: %d\n",
pRead->i1, pRead->i2, pWrite->i1, pWrite->i2);
printf("Press 'Enter' to increment values or 'q' and then 'Enter' to quit\n");
pWrite->i1++;
pWrite->i2--;
} while (getchar() != 'q');
munmap(pRead, sizeof(*pRead));
shm_unlink(sSharedMemReadName);
munmap(pWrite, sizeof(*pWrite));
shm_unlink(sSharedMemWriteName);
exit(0);
}
在Linux 下的编程注意 shm_open();若使用使有问题,可以用open()函数替代。
Linux下共享内存的实质:是在/dev/shm/ 文件夹下创建相应文件,路径为: /dev/shm/文件名;
Codesys若运行于Linux下则是在该路径创建共享文件。
Windows平台,C++/ C # 编程:
C++:
OpenFileMapping();
CreateFileMapping();
MapViewOfFile();
GetProcessWorkingSetSize(); //查询进程最大,最小工作集内存大小
SetProcessWorkingSetSize(); //设定进程最大,最小工作集内存大小,在进程挂起,或最小化时,将部分内存交换到虚拟内存。
VirtualLock(); //锁定进程的虚拟地址空间的指定块到物理内存。
C#:
using System;
using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;
using System.Threading;
namespace SharedMemoryWin
{
// Example structure for data exchange
internal struct DataExchange
{
internal Int32 i1;
internal Int32 i2;
}
class Program
{
static void Main(string[] args)
{
DataExchange dataExchangeRead, dataExchangeWrite;
dataExchangeWrite.i1 = 0;
dataExchangeWrite.i2 = 0;
Console.Out.WriteLine("Press 'q' to quit");
int dataSIze = Marshal.SizeOf(typeof(DataExchange));
// Open a mapped file with read access and one with write access.
using (var mmfRead = MemoryMappedFile.CreateOrOpen("_CODESYS_SharedMemoryTest_Write", dataSIze))
using (var mmfWrite = MemoryMappedFile.CreateOrOpen("_CODESYS_SharedMemoryTest_Read", dataSIze))
{
bool quit = false;
while (!quit)
{
using (var accessorRead = mmfRead.CreateViewAccessor(0, dataSIze, MemoryMappedFileAccess.Read))
using (var accessorWrite = mmfWrite.CreateViewAccessor(0, dataSIze, MemoryMappedFileAccess.Write))
{
// Read the structure
accessorRead.Read(0, out dataExchangeRead);
// Write the structure
accessorWrite.Write(0, ref dataExchangeWrite);
// Display the values
Console.Out.Write("Read i1: {0} i2: {1} Write i1: {2} i2: {3}\r",
dataExchangeRead.i1,
dataExchangeRead.i2,
dataExchangeWrite.i1,
dataExchangeWrite.i2);
// Wait a second
Thread.Sleep(1000);
// Increment sample values
dataExchangeWrite.i1++;
dataExchangeWrite.i2--;
// Check quit condition
if(Console.KeyAvailable)
if (Console.ReadKey().KeyChar == 'q')
quit = true;
}
}
}
}
}
}
Codesys 使用共享内存 打通通讯的更多相关文章
- java 并发性和多线程 -- 读感 (二 线程间通讯,共享内存的机制)
参考文章:http://ifeve.com/java-concurrency-thread-directory/ 其中的竞态,线程安全,内存模型,线程间的通信,java ThreadLocal类小节部 ...
- [转]WINDOW进程间数据通讯以及共享内存
1.引言 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效地进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换,就如同 ...
- win32进程间通讯--共享内存
小白一枚,如有不对,请各位大神多多指教! 最近看了看win32进程间通讯.简单写了写利用共享内存实现进程间通讯 使用共享内存实现进程间通讯: 1.在WM_CREATE消息下创建文件映射内核对象 hMa ...
- QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开 本文地址:h ...
- 【转】JAVA 并发性和多线程 -- 读感 (二 线程间通讯,共享内存的机制)
原文地址:https://www.cnblogs.com/edenpans/p/6020113.html 参考文章:http://ifeve.com/java-concurrency-thread-d ...
- ACE框架 基于共享内存的进程间通讯
ACE框架将基于共享内存的进程间通讯功能,如其它IO组件或IPC组件一样,设计成三个组件.流操作组件ACE_MEM_Stream,连接器组件ACE_MEM_Connector,以及接收连接组件ACE_ ...
- Windows进程间通讯(IPC)----共享内存
Windows中同一个EXE文件多次加载过程 Windows中EXE文件加载是基于内存映射文件的. 当EXE文件第一次被加载. 首先系统会先创建一个进程内核对象,并创建一个新的进程地址空间. 系统调用 ...
- 8.7 进程间的通讯:管道、消息队列、共享内存、信号量、信号、Socket
进程间的通讯 进程间为什么需要通讯? 共享数据.数据传输.消息通知.进程控制 进程间的通讯有哪些类型? 首先,联系前面讲过的知识,进程之间的用户地址空间是相互独立的,不能进行互相访问,但是,内核空间却 ...
- v76.01 鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式 | 百篇博客分析OpenHarmony源码
百篇博客分析|本篇为:(共享内存篇) | 进程间最快通讯方式 进程通讯相关篇为: v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志 v27.05 鸿蒙内核源码分析(互斥锁) | 同样 ...
随机推荐
- [洛谷P1552] [APIO2012]派遣(左偏树)
这道题是我做的左偏树的入门题,奈何还是看了zsy大佬的题解才能过,唉,我太弱了. 左偏树总结 Part 1 理解题目 很显然,通过管理关系的不断连边,最后连出来的肯定是一棵树,那么不难得出,当一个忍者 ...
- hdu5857 Median(模拟)
Median Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- vue 中公共样式
html, body, h1, h2, h3, h4, h5, h6, p, textarea, input, select, ul, ol, li, fieldset, figure { margi ...
- python写入mysql
import pymysql conn = pymysql.connect(host='192.168.70.129',port=3306,user='root',passwd='123456', ...
- PCA算法和实例
PCA算法 算法步骤: 假设有m条n维数据. 1. 将原始数据按列组成n行m列矩阵X 2. 将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值 3. 求出协方差矩阵C=1/mXXT 4. ...
- php中__call与__callstatic()使用
php 5.3 后新增了 __call 与__callStatic 魔法方法. __call 当要调用的方法不存在或权限不足时,会自动调用__call 方法. __callStatic 当调用的静态方 ...
- javascript数组赋值操作的坑
描述:数组对象赋值,即arr1=[{},{},{}]这种数据结构的对象赋值,将arr1赋值给arr2:然后删除arr2里的元素 一.最常用的= arr2 = arr1; detect(val) { l ...
- vim/vi编辑工具实现多行注释和取消注释
转载声明:本文为转载文章 原文地址:https://blog.51cto.com/3332935/2106143 多行注释: 进入命令行模式--> 将光标移动到要注释的第一行位置--> 按 ...
- 洛咕P4180 严格次小生成树
鸽了很久的一道题(?)貌似是去年NOIP前听的emm... 首先我们分析一下最小生成树的性质 我们kruskal建树的时候呢是从小到大贪心加的边,这个的证明用到拟阵.(我太菜了不会) 首先我们不存在连 ...
- 2.WCF学习--地址
一.URI(统一资源标识) web服务可视为一种网络资源,并且可以通过一个URI来进行唯一标识.而服务通过终结点的形式发布出来,我们所说的一个服务在大部分场景中实际上指的是服务的某个终结点.终结点的核 ...