@cyysu
2018-04-21T05:23:21.000000Z
字数 1860
阅读 1145
- 时间:2018年4月21日11:27:58
- 作者:Kali
- 邮箱:cyysu.github.io@gmail.com/2869905223@qq.com/微信lwyx1413
- 版本:6.0
- 描述:eCLR共享内存
ECLR+Multiprog开发
共享内存的方式开发步骤和Native开发步骤类似,这里就重点截取一下代码图部分以及需要额外注意的地方。其中C#接口部分如下
// 添加一块共享内存
// %MB3.0 .. %MB3.199
[AT_M3(0, 200)]
[Native]
public class SharedMemory1
{
public unsafe static void* GetMemPtr()
{
return null;
}
}
注册
<DeviceModuleConfiguration>
<Profile Name="eCLR 2.2 Simulation (Core: 2.8.1)" IsDefault="0" CoreProfileVersion="2.8.1" InternalVersion="2.2.0">
<DeviceDescription MaximumImageFilesSize="67108864" MaximumImageSize="67108864" MaximumRetainDataSize="327696" MaximumDataSize="10485768" MaximumProgramSize="4194304" ScheduleInterval="1000" ThreadingPriorityLevel="12" CPUType="259" IsDownloadChangesCapable="true"/>
<CILCompiler Prefix="cilc" ProcessorType="i486" ProgrammingModel="msc12" Version="2.0.0" />
<SimulationSupported>true</SimulationSupported>
<Assembly Name="demoio" Version="2.1.0" IsNative="1"/>
<Assembly Name="simio" Version="1.0.0" IsNative="1"/>
<Assembly Name="ClassLibrary1" Version="1.0.0" IsNative="1"/>
<Assembly Name="eCLRFWDev" Version="1.0.0" IsNative="1"/>
<DownloadPouInfoList>true</DownloadPouInfoList>
<DownloadSfcPouList>true</DownloadSfcPouList>
</Profile>
</DeviceModuleConfiguration>
# 实现
// 这个长度要和Multiprog中定义的一致
// 返回的地址和[AT_M3(0, 200)]中的0对应
char buff[200];
// class FB_FU_Managed.SharedMemory1 implementation
Void* __PInvoke__ ClassLibrary1::SharedMemory1::GetMemPtr()
{
// implement your code here !
// 返回的一定要是一个地址
buff[4] = 0x12;
buff[5] = 0x34;
buff[6] = 0x56;
buff[7] = 0x78;
return buff;
}
这个需要注意的就是不要忘记注册我们编译出来的库以及避免数组越界问题。IO操作部分和此部分类似,我这里就直接在下面进行讲解了。
C#接口声明部分,只有红框内可以更改,其他内容均不可以更改
C++实现部分代码
Multiprog设置变量的情况,这个是byte类型
Multiprog运行情况
也就是开始会调用ReadByte函数读取一些数据,然后在调用WriteByte函数进行写,下面是调试的过程
从调试中我们可以看出p0表示的是IO的地址(变量地址-IO组首地址),p1表示地址内的数据。其中的IO组地址如果0组是0-8,1组是8-15,那么0组和1组的首地址分别为0和8。详细的过程看下图。
以上内容有笔者自己编写,也有摘自互联网。摘自互联网部分笔者都会仔细阅读,确保符合笔者当时测试情况进行编写,当然在学习的过程中不可避免的有理解不到位的地方,还请读友批评指正。
支付宝 微信