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 使用共享内存 打通通讯的更多相关文章

  1. java 并发性和多线程 -- 读感 (二 线程间通讯,共享内存的机制)

    参考文章:http://ifeve.com/java-concurrency-thread-directory/ 其中的竞态,线程安全,内存模型,线程间的通信,java ThreadLocal类小节部 ...

  2. [转]WINDOW进程间数据通讯以及共享内存

    1.引言 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效地进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换,就如同 ...

  3. win32进程间通讯--共享内存

    小白一枚,如有不对,请各位大神多多指教! 最近看了看win32进程间通讯.简单写了写利用共享内存实现进程间通讯 使用共享内存实现进程间通讯: 1.在WM_CREATE消息下创建文件映射内核对象 hMa ...

  4. QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开     本文地址:h ...

  5. 【转】JAVA 并发性和多线程 -- 读感 (二 线程间通讯,共享内存的机制)

    原文地址:https://www.cnblogs.com/edenpans/p/6020113.html 参考文章:http://ifeve.com/java-concurrency-thread-d ...

  6. ACE框架 基于共享内存的进程间通讯

    ACE框架将基于共享内存的进程间通讯功能,如其它IO组件或IPC组件一样,设计成三个组件.流操作组件ACE_MEM_Stream,连接器组件ACE_MEM_Connector,以及接收连接组件ACE_ ...

  7. Windows进程间通讯(IPC)----共享内存

    Windows中同一个EXE文件多次加载过程 Windows中EXE文件加载是基于内存映射文件的. 当EXE文件第一次被加载. 首先系统会先创建一个进程内核对象,并创建一个新的进程地址空间. 系统调用 ...

  8. 8.7 进程间的通讯:管道、消息队列、共享内存、信号量、信号、Socket

    进程间的通讯 进程间为什么需要通讯? 共享数据.数据传输.消息通知.进程控制 进程间的通讯有哪些类型? 首先,联系前面讲过的知识,进程之间的用户地址空间是相互独立的,不能进行互相访问,但是,内核空间却 ...

  9. v76.01 鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式 | 百篇博客分析OpenHarmony源码

    百篇博客分析|本篇为:(共享内存篇) | 进程间最快通讯方式 进程通讯相关篇为: v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志 v27.05 鸿蒙内核源码分析(互斥锁) | 同样 ...

随机推荐

  1. python开发之路-day03

    一 文件操作一 介绍 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所 ...

  2. C# 使用Epplus导出数据到Excel

    简介:Epplus是一个使用Open Office XML(Xlsx)文件格式,能读写Excel 2007/2010文件的开源组件 功效:支持对excel文档的汇入汇出,图表(excel自带的图表基本 ...

  3. java 进销存 商户管理 系统 管理 库存管理 销售报表springmvc SSM项目

    统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3  SSM 普 ...

  4. vue 项目,获取手机验证码和图形验证码(iviewUI框架)

    1.编辑获取验证码模块 <Form ref="phoneFormItem" :model="phoneFormItem" :label-width=&qu ...

  5. BZOJ-3143/洛谷3232 游走(HNOI2013)概率DP

    题意:给定n个点m条边.每条边的权值还没决定,权值大小为从1到m.从1出发每次等概率选一条出边向下走,直到走到n点停止,路径代价就是边权总和.由你来决定边权来使得上诉路径代价期望值最小. 解法:点这么 ...

  6. vue代理配置之二--dev方式启动的index.js配置

    'use strict' // Template version: 1.3.1 // see http://vuejs-templates.github.io/webpack for document ...

  7. [BZOJ4826] [HNOI2017] 影魔 单调栈 主席树

    题面 因为是一个排列,所以不会有重复的.如果有重复就没法做了.一开始没有仔细看题目想了半天. 发现,如果是第一种情况,那么边界\(l\)和\(r\)就应该分别是整个区间的最大值和次大值. 然后,对于那 ...

  8. JAVA 利用 jmc或jvisualvm 监控 本地或者远程JVM

    本地检测之间到$JAVA_HOME/bin 下的目录点击jmc 或者jvisualvm,然后选择你要监控的app 可是一般我们生产环境项目都是部署在远程,这个时候想要监控怎么办 1.监控tomcat ...

  9. find命令进阶用法(一)

    -cmin n: 查找 exactly n 分钟前内容或属性被最后修过的文件 -cnewer file: 查找内容或属性的最后修改时间晚于file文件的文件 -ctime n: 查找 **n*24** ...

  10. JavaWeb(一):Java技术概览

    一.Java技术体系 在早期,Java被称为Java开发工具包或JDK,是一门与平台(由一组 必需的API组成)紧密耦合的语言. 从1998年底的1.2版本开始,Java技术栈被分割为下面关键部分: ...