第一章:介绍
本手册分为6章(不算次介绍部分)。第一章介绍s7nodave用于EPICS的设备支持的概念和特新。第二章描述启动一个使用s7nodave的IOC项目所需要的几步。第三章描述s7nodave支持的IOC shell命令。之后,第四章解释s7nodave支持的各种记录类型。最后,第五章解释如何使用轮询组。
如果你之前已经使用了本软件并且正在升级到一个更新版本,你会发现描述在最新版本中已经做的修改以及你如何可以更新你的项目来匹配这些变化是有用的。
警告:
当你使用此软件来连接到一个PLC,在尝试建立一个连接前,断开此台PLC的所有外部连接。
此软件会覆盖在PLC内存中部分变量或者甚至在PLC中正在运行的部分程序。因而,PLC的输出可能展示了不可预测的行为。
有很多不同PLC类型并且取决于PC的类型,它的配置,用于EPICS IOC的主机类型,主机的配置以及EPICS IOC的配置,此软件可能非常不同,可能不想要地的结果。
在连接任何设备到PLC前,要确保其使用安全并且符合当前规定,是使用此软件用户的责任。违反此规定可能导致设备被损害或者甚至由于设备不正常造成人员伤亡。
第二章 概念
- 2.1 Snap7
- 2.2 支持的设备
- 2.3 PLC和EPICS之间通信
- 2.4 集成到EPICS
本章介绍s7nodave设备支持的概念以及由它提供的特性。
2.1 Snap7
s7nodave设备支持是基于Snap7。这个库实现了由来自S7系列很多PLCs支持的通信协议,并且因而使得PC上的软件与一台PLC通信,而不需要在PLC这边显式地实现通信例程。
在以前,s7nodave设备支持已经是基于libnodave。由于在libnodave中一个不容易被修复地漏洞,这对s7nodave版本3.0做了修改。
2.2 支持的设备
基本上,s7nodave支持由Snap7支持地所有PLCs。
使用S7-1200 PLC开发了S7nodave。但,我们已经见到它对S7-300和S7-1500 PLCs有效。
对于新版本的PLCs或者TIA Portal,(尤其S7-1200和S7-1500系列,PLCs和TIA Portal版本12或者以上),为了允许完全访问PLCs的内存,在S7项目中的设置可能必须被修改。你可能只能够访问全局DBs而用于那些DBs的优化访问块必须被禁用。除此外,访问级别还必须被设置成完全并且连接机制必须允许GET/PUT通信。更多细节,请参考来自Snap7项目S7项目的信息,包括重要配置对话框的截屏。
重要:
确认正在被使用的PLC兼容此软件是每个用户的责任。有关此软件与某种PLC的兼容性或者某个程序的合格性,此软件作者不承担任何责任。
2.3 PLC和EPICS之间通信
来自PSI的S7plc驱动程序是基于PLC和EPICS IOC之间被交换的整个数据块。这表示,对PLC编写单个记录是不可能的。而是,所有值被一次发送。相同的应用于读取请求。另外,数据块的结构被编码成一个PLC程序。如果一个值被添加到这个块或者被从这个块移除,在PLC逻辑以及在EPICS记录配置中的地址必须被更新。
s7nodave设备支持在另一方面,直接从PLC中内存地址读取以及写入PLC中内存地址。在EPICS记录中配置的地址与用于对PLC逻辑编程使用相同的标记。当一个输出记录运行时,这个记录的值被发送给了PLC。对于输入记录,不同记录以不同速率被运行,并且仅在i昂同轮询组中的值才被一起传输。
2.4 集成到EPICS
以一个基于asynDriver的异步设备支持实现了S7nodave。虽然asynDriver被用于配置管理,日志以及异步运行,但不使用asynDriver支持的设备支持和地城I/O例程。
第三章 开始
- 3.1 前提
- 3.2 编译前提
- 3.3 编译s7nodave
- 3.4 在项目中使用s7nodave
本章描述设置一个使用s7nodave的简单项目所需的步骤。首先,描述使用s7nodave的前提。然后,解释s7nodave设备支持的安装和编译。最后,演示在一个项目中包含s7nodave设备支持所需的步骤。
3.1 前提
S7nodave有3个前提:首先需要EPICS base R3.14.12或者更高。更老的EPICS base版本可能有用,但遇到对aai和aao记录类型支持的情况,必须被禁用,因为这些记录在更早版本的EPICS base中缺失了。
此外,需要asynDriver。S7nodave最对asyn 4.13版本开发的,但它很可能对更新版本也有效。
一个包含s7nodave需要的所有组件的最小版本的Snap7与s7nodave捆绑在一起,并且在编译s7nodave时自动被编译。因而,你不需要自己下载或者编译Snap7。
S7nodave已经在Linux下被开发,但应该在大部分POSIX兼容操作系统上有效。在Windows系统上,你必须使用一个像Cygwin的兼容层护着更改s7nodave中的网络代码来使用来自Windows API的各自函数。
3.2 编译前提
对于编译EPICS base和asynDriver,请查看各自手册。
3.3 编译s7nodave
在从项目网站下载了s7nodave后,提取它到你想要按照它所在的目录中。一个好的地址可能是/usr/local/EPICS/modules目录。
[root@localhost EPICS]# cd moudles/
[root@localhost moudles]# ls
s7nodave-3.0.2.tar.gz
[root@localhost moudles]# tar -xvzf s7nodave-3.0.2.tar.gz
之后,为了配置EPICS base和asynDriver被安装所在的位置,你必须编辑添加文件configure/RELEASE.local。添加变量ASYN和EPICS_BASE到这个文件,并且确认它们指向了正确的目录。你可以在configure/EXAMPLE_RELEASE.local中找到一个示例。
在这里,我们对复制的文件,进行了如下修改:
[root@localhost configure]# cp EXAMPLE_RELEASE.local RELEASE.local
[root@localhost configure]# vim RELEASE.local
[root@localhost configure]# cat RELEASE.local
EPICS_BASE=/usr/local/EPICS/base
ASYN=/usr/local/EPICS/synApps/support/asyn
必须用一个支持C++ 11的C++编译器编译S7nodave。对于某些编译器,C++ 11支持是默认不其用的。在这种情况,你必须添加文件configure/CONFIG_SITE.local并且在末尾为USR_CXXFLAGS变量添加合适的编译器选项。对应一个配置文件的一个示例可以在configure/EXAMPLE_CONFIG_SITE.local中找到。
在这里我们复制了示例配置文件:
[root@localhost configure]# cp EXAMPLE_CONFIG_SITE.local CONFIG_SITE.local
在编辑这个路径后,你可以退回到s7nodave顶层目录,运行make来构建s7nodave。
[root@localhost s7nodave-3.0.2]# make
[root@localhost s7nodave-3.0.2]# ls
configure dbd docs include lib Makefile NEWS README s7nodaveApp
3.4 在项目中使用s7nodave
在你项目的configure/RELEASE文件中,你必须添加像 S7NODAVE=/usr/local/EPICS/modules/s7nodave这样的一行。为了在你的记录定义文件中使用s7nodave设备支持,在你程序的src目录的Makefile文件中(例如:myApp/src/Makefile)中,你必须添加像以下的内容:
my_DBD += s7nodave.dbd
my_LIBS += s7nodave
最后,你必须在你的IOC启动文件中配置至少一个PLC连接。相应命令的语法,见"章节4.1 "s7nodaveConfigureIsoTcpPort""。可选地,你也想要配置轮询组(poll groups)。对于定义从PLC读取或者写入PLC地记录,请参考记录参考。
第四章、IOC shell参考
- 4.1 s7nodaveConfigureIsoTcpPort
- 4.2 s7nodaveConfigurePollGroup
S7nodave支持IOC shell命令来配置一个PLC连接和来添加轮询组。此外,还支持用于配置跟踪掩码和跟踪I/O掩码的asyn命令。但,为了在IOC shell中启用这些命令,你必须添加asyn.dbd到你项目使用的DBDs列表。
4.1 s7nodaveConfigureIsoTcpPort
s7nodaveConfigureIsoTcpPort命令用于建立一个到一个PLC的连接并且命令有以下语法:
s7nodaveConfigureIsoTcpPort(PLC name, PLC hostname or IP address, PLC rack number, PLC slot number, thread priority)
1) PLC name:是一个任意字符串,其用于在记录的设备地址字段中以及当位这个PLC配置轮询组时指向这个PLC。但,PLC名称不可以包含空格或括号。
2)PLC hostname or IP address:时这个PLC的DNS主机名或IP地址,可选地后跟这个TCP端口号(由分号从主机名或IP地址分开)。如果没有指定端口地址,使用默认端口(102)。
3) PLC rack number和PLC slot number取决于实际地PLC配置。对于大多数设置,两个数值都是0,但对某些S7-300系列PLCs必须使用rack 0,slot 2。如果你不能访问那台PLC,尝试更改那些数值。有疑问,你应该能够在你S7项目的配置中找到正确数值。你可以在Snap7库的参考手册中找到有关rack和slot数值的更多信息。
4)thread priority是用于通信线程的优先级(用asyn命名,端口线程)。如果指定了一个0的优先级,使用epicsThreadPriorityMedium。
一配置到一个PLC的一个连接的示例行看起来像这样:
s7nodaveConfigureIsoTcpPort("myPLC", "myplc.example.com", 0, 0, 0)
你可以在你的IOC启动配置中有多个s7nodaveConfigureIsoTcpPort的实例,但,对于每个实例,使用的PLC名称必须唯一。
4.2 s7nodaveConfigurePollGroup
s7nodaveConfigurePollGroup命令必须用于配置poll groups,并且有以下语法:
s7nodaveConfigurePollGroup(PLC name, poll-group name, poll interval, thread priority)
1) PLC name必须是先前在一个s7nodaveConfigureIosTcpPort的实例中使用的PLC名称。
2) poll-group name是一个任意字符串,它表示这个poll-group并且必须对这个PLC唯一。但,相同的poll-group名称可以用于两个不同的PLCs。poll-group名称必须不包含空白,括号,等号或者都好。
3) poll interval是一个浮点数值,它指定了用此间隔读取属于这个轮询组的内存地址。轮询间隔的单位是秒。
4) thread priority:制定了这个线程的优先级,其周期地运行这个轮询组。如果指定了一个0优先级,使用优先级epicsThreadPriorityMedium。
一配置一个一个查询组(每一秒钟被运行依次)的示例行,看起来像这样:
s7nodaveConfigurePollGroup("myPLC", "1s", 1.0, 0)
每个PLC,你可以有多个s7nodaveConfigurePollGroup的实例,但对于指向相同PLC的每个实例,这个poll-group必须唯一。
第五章 记录参考
5.1 设备地址格式
5.2 PLC内存地址
5.3 PLC 数据类型
5.4 支持的参数
- 5.4.1 PG -- 指定一个轮询组
- 5.4.2 DLV,DLH -- 指定设备值限制
5.5 受支持的记录
- 5.5.1 aai-数组输入
- 5.5.2 aao-数组输出
- 5.5.3 ai-模拟输入
- 5.5.4 ao-模拟输出
- 5.5.5 bi-二进制输入
- 5.5.6 bo-二进制输出
- 5.5.7 longin-整数输入
- 5.5.8 longout-整数输出
- 5.5.9 mbbi,mbbiDirect-多位二进制输入
- 5.5.10 mbbo,mbboDirect-多位二进制输出
- 5.5.11 stringin-字符串输入
- 5.5.12 stringout-字符串输出
- 5.5.13 waveform-输入输入或输出
在本章钟,首先解释用于s7nodave设备支持的设备地址的格式。接着描述s7nodave支持的各种PLC数据类型。最后,详细给出了由s7nodave支持的这些记录。
5.1 设备地址格式
为了对一个记录使用s7nodave设备地址支持,记录的设备类型字段(DTYP)必须指定s7nodave。这种设备类型用于除waveform记录外的由s7nodave支持的所有记录。
这个记录的设备地址字段(通常INP用于输入,而OUT用于输出)必须指定一个被s7nodave识别的设备地址。
一般,一个用于s7nodave的设备地址有以下格式:
@PLC-name[(param1=value1,param2=value2,...)] PLC-address [PLC-data-type]
准确受支持的选项会根据记录类型变化。
每个设备地址以符号@-sign起始,后跟PLC名称。PLC名称必须是在IOC启动文件中使用s7nodaveConfigureIsoTcpPort配置的一个PLC的名称。
PLC名称后跟包围在括号中的可选参数列表。如果没有指定参数,可以省略括号。受支持的参数取决于记录类型。详细请见"章节5.4 "受支持参数""和"章节5.5 受支持的记录"。如果制定了多个参数,用逗号分隔它们。
PLC内存地址由空格从PLC名称(或者可选的参数列表)分开。有关PLC内存地址的格式请参考"章节5.2 PLC内存地址"。
最后,可以指定一个可选的PLC数据类型,其由空格从PLC内存地址分开。如果没有指定数据类型,根据记录类型和PLC内存地址,猜测数据类型。有关受支持的PLC数据类型请参考"章节5.3 PLC数据类型"和"章节5.4 受支持的参数"。
有效设备地址的示例:
@myPLC(DLV=0,DHV=27648) IW64
@myPLC(DLV=0,DHV=27648) IW66 int16
@myPLC IB0
@myPLC QB0
s7nodave使用用于PLC内存地址的相同格式,那也经常用于对PLCs进行编程(例如:使用Step7或WinPLC)。同时支持英语和德语标记并且相互等价。
这种格式组合了在PLC内存中一个变量的起始字节的格式和变量的宽度的格式。
PLC地址以内存区开始。支持以下内存区:
表格5.1 PLC内存区
英语 | 德语 | 描述 |
DBn.DB | DBn.DB | 数据块(n必须是一个整数数值) |
F | M | 标记 |
I | E | 输入内存映像 |
Q | A | 输出内存映像 |
T | T | 计时器 |
C | Z | 计数器 |
对于数据块地址,数据块数值必须被包含在这个区域格式中。对于使用数据块,标记,输入内存和输出内存区的地址,你接着必须指定(应该被从其读取或者被写入到其)内存宽度。用于指定这个宽度的标记是:
表格5.2 PLC内存宽度
标记 | 描述 |
X | 位(仅用于DB区,其它区域使用空字符串替代) |
B | 字节(8位) |
W | 字(16位) |
D | 双字(32位) |
对于指向单个位的地址(除了在DB区域中的位地址外)以及对于指向计数器或者计时器的地址,不给出宽度规格:由指定在字节中的位识别位地址而计数器和计时器区总是使用字(16位)值。
在指定内存宽度后,必须指定起始地址。总是用从各自区域(从0开始)起始开始计算的字节数指定起始地址。例如,如果在DB1开始,存储了2个32位数值,对应这些数值的两个地址是DB1.DB0和DB1.DB4。
对于指向单个位的地址,必须指定在字节中的起始位,由一个点号从起始字节分开。例如,为了指向输入内存区中第一个字节的第一位,你使用地址I0.0。你一定不能对一个字节,字或双字地址指定一个起始位。
PLC内存地址格式是不区分大小写的。但,为了强化可读性,推荐使用大写字符。
有效内存地址的示例:
DB3.DBD4
FW4
IB2
Q8.3
DB50.DBX17.3
T2
C2
5.3 PLC 数据类型
s7nodave支持八种不同的PLC数据类型。这些数据类型中每一种仅与具有正确宽度的内存地址一起使用。
表格5.3 PLC数据类型和它们对应的内存宽度
数据类型 | 内存宽度 | 描述 |
bool | 1位 | 布尔 |
int8 | 字节(8位) | 符号整型 |
uint8 | 字节(8位) | 无符号整型 |
int16 | 字(16位) | 符号整型 |
uint16 | 字(16位) | 无符号整型 |
int32 | 双字(32位) | 符号整型 |
uint32 | 双字(32位) | 无符号整型 |
float | 双字(32位) | 单精度浮点数 |
可用的数据类型也受到使用的记录类型限制。详细请参考章节5.5,"受支持的记录"。
5.4 支持的参数
有很多可以用于为一个记录指定设备支持特定选项的可选参数。这些选项的大部分只对一个特定记录类型有效,所以请参考各自选项的描述来查明哪些选项能够与哪些记录类型一起使用。
5.4.1 PG--指定一个轮询组(Poll Group)
PG参数可以与所有输入记录一起使用来为记录指定一个轮询组。仅在记录的SCAN字段被设置成I/O Intr时,它才有用。示例:@myPLC(PG=1s) IW64。
5.4.2 DLV DHV -- 指定设备值限制
DLV和DHV参数指定从PLC读取的raw值或者被写入PLC的raw值的上下范围。当记录的LINR字段被设置为LINEAR时,这些值与记录字段EGUL和EGUF一起被用于转换raw值到工程单位表示的值,并且反之亦然。
如果启用了线性转换,用这样一种方式设置转换参数,一个DLV的raw值对应一个EGUL的工程单位值而一个DHV的raw值对应一个EGUF的工程单位值。有关线性转换,请参考在EPICS记录参考手册中ai和ao记录的描述。
5.5 支持的记录
S7nodave支持EPICS base中大部分记录,其有对应设备支持例程的接口。为了对一个记录使用s7nodave,记录的DTYP和INP或OUT字段必须被正确地设置。详细请参考章节5.1 "设备地址格式"。本章描述对应每种受支持记录类型地特殊选项。
本手册只描述每种记录地那些专用于s7nodave设备支持地特性。有关每种记录类型和其字段的一般性描述请参考EPICS记录参考手册。
5.5.1 aai--数组输出
aai记录用于从PLC的内存读取多个元素到一个数组。受支持的数据类型取决于在记录的FTVL字段中指定的EPICS数据类型以及在如下表格中描述:
表格 5.4 PLC数据类型到EPICS类型的映射
对于除了STRING外所有EPICS数据类型,PLC数据类型的宽度必须匹配PLC地址的宽度。在这种情况中,读取的字节总是是PLC数据类型的宽度乘以此数组中元素数目。指定的PLC内存地址是数组中第一个元素的起始。
如果FTVL设置为STRING,PLC内存地址必须是一个字节。这个字节被认为是数组中第一个字符串的第一个字节。总计,为数组中每个元素读取40个字节。例如,如果数组有10个元素,从PLC内存读取了400个字节。
如果指定的PLC地址指向了一个位,从PLC读取的位数等于数组中元素数目。这种读取不是一定被对齐到字节边界。
5.5.2 aao-数组输出
aao记录用于从一个数组写多个元素到PLC的内存。受支持的PLC数据类型取决于在记录的FTVL中指定的EPICS数据类型,如在以下表格中描述:
5.5 EPICS类型到PLC类型的映射
对于除了STRING外的所有EPICS数据类型,PLC数据类型的宽度碧玺匹配PLC地址的宽度。在这种情况中,被写的字节总数为PLC数据类型的宽度乘上数组中元素数目。指定的PLC内存地址是数组中第一个元素的起始。
如果FTVL设设置成STRING,PLC内存地址必须是一个字节。这个字节被当成数组中第一个字符串的第一个字节。总计,为数组中每个元素写40个字节。例如,如果数组有10个元素,400个字节被写入到了PLC内存。
如果指定的我PLC地址指向一个位,被写入到PLC的位数等于数组中元素数目。这种写不是必须被对齐到字节边界。在被写入到对应位前,每个非0数值被转换成1。
写一个DOUBLE值可能与精度丢失联系,由于PLC驱动程序仅支持单精度浮点数值。
5.5.3 ai-模拟输入
ai记录用于从PLC读取模拟值。为了从PLC raw值转换到工程单位,DLV和DVH选项可以被使用(见章节5.4.2 "DLV, DHV - 指定设备值限制")。
这个记录支持的PLC数据类型是bool, int8, uint8, uint16, int16, int32和float。当使用float类型时,从raw到工程单位的转换不被支持。从PLC内存读取的值直接被写到了这个记录的VAL字段。
5.5.4 ao-模拟输出
ao记录用于写模拟值到PLC。为了从工程单位转换到PLC raw单位,可以使用DLV和DHV选项(见章节5.4.2 "DLV DHV -- 指定设备值限制")。
这个记录支持的PLC数据类型是bool,int8,uint8,int16, uint16, int32和float。当使用float类型时,从工程单位到raw单位的转换不被支持。这个激烈的VAL字段的值被直接写入了PLC的内存。请注意如果计算的raw值不匹配指定的PLC的数据类型,从工程单位到raw单位转换可能丢失精度。
5.5.5 bi-二进制输入
bi记录用于从PLC读取二进制状态。这个记录支持的PLC数据类型是bool, int8, uint8, int16,uint16,int32,uint32和float。
对于除了float外的所有类型,一个不等于0的值被当作1。对于floats,一个NaN或+inf和-inf的值也被当成0。
5.5.6 bo-二进制输出
bo记录用于设置PLC中一个二进制状态。这个记录支持的PLC数据类型是bool, int8, uint8, int16, uint16, int32, uint32和float。
5.5.7 longin-整数输入
longin记录用于从PLC读取一个整数值。这个记录支持的PLC数据类型是bool, int8, uint8, int16, uint16和int32。
5.5.8 longout-整数输出
longout记录用于写一个整数值到PLC。这个记录支持的PLC数据类型是bool, int8, uint8, int16, uint16和int32。
5.5.9 mbbi,mbbiDirect-多位二进制输入
mbbi和mbbiDirect记录类型用于从PLC读取一个多位状态。这个记录支持的PLC数据类型是int8, uint8, int16, uint16和uint32。
这个记录的SHFT和NOBT字段是被s7nodave设备支持支持的,因而可以读取没有被对齐到字节边界的位。
到目前为止有关s7nodave设备支持,mbbi和mbbiDirect记录类型之间没有差别。有关这两个记录类型之间的差别,请参考EPICS记录参考手册。
5.5.10 mbbo,mbboDirect-多位二进制输出
mbbo和mboDirect记录类型是用于写一个由多位组成的状态到PLC。这个记录支持的PLC数据类型是int8, uint8, int16, uint16, int32和uint32。
这个记录的SHFT和NOBT字段是被s7nodave设备支持支持的,因而能够写没有对齐到字节边界的位。但,写操作总是被用于完成的字节,设置其它位位0。如果你想要设置特定位而不更改相同字节中其它位,你应该使用bo或aao记录。
到目前为止关注的s7nodave设备支持,在mbbo和mbboDirect记录类型之间没有差别。有关这两个记录之间的差别,请参考EPICS记录参考手册。
5.5.11 stringin-字符串输入
stringin记录用于从PLC读取一个字符串。这个记录支持的PLC数据类型是bool, int8和uint8。
如果制定了int8(默认)或uint8数据类型,从PLC读取40个字节并且解析成一个字符串。
如果指定了bool数据类型,从PLC读取单个位并且如果这位是1,这个字符串设为"TRUE",如果这位设为0,则为"FALSE"。
5.5.12 stringout-字符串输出
stringout记录是用于写一个字符串到PLC。这个记录支持的PLC数据类型是bool, int8和uint8。
如果指定了int8(默认)或uint8,存储在记录的VAL中字符串的40个字节被写到了PLC。
如果指定了bool数据类型,单个位被写到PLC。如果这个字符串是"TRUE"或"1", 1被写,否则写0。
5.5.13 waveform-输入输入或输出
waveform记录是可以替换aai和aao记录。不同于其它记录,它可以当作一个输入或输出记录。设备地址总是被存储在记录的INP字段。如果你想要把此记录用作输入记录,你必须设置记录的DTYP字段为s7nodaveWfIn,如果你想要把此记录用作输出记录,这个字段必须被支持成s7nodaveWfOut。除了那,到目前为止关注的s7nodave设备支持,这个记录作用完全与aai或aao记录相同。
第六章 轮询组
- 6.1 创建一个轮询组
- 6.2 在轮询组中包含一个记录
如果你周期地扫描多个输入记录,它们从PLC读取数据,这是非常低效的,因为每个读取操作通过网络发送一次读取请求并且必须等待来自PLC的响应。
因而,如果多个输入记录应该以相同速率被运行,你应该放置它们到相同的轮询组。对应位于相同轮询组的所有记录的读取请求被放置在相同读取请求中(除非超过了包尺寸)并且被一起发送给PLC。相应地,来自PLC对所有读取请求的响应也在单个包中被发送,因而显著减少了所需的往返次数。
6.1 创建一个轮询组
在IOC启动配置中使用s7nodaveConfigurePollGroup创建一个轮询组。如果你使用poll-group名称"default",这有特殊含义。这个poll-group是用于被设置成使用一个轮询组但没有显式地指定要使用地轮询组名称的所有记录。对于被配置的每个PLC,必须单独地配置默认的轮询组。
6.2 在轮询组中包含一个记录
为了使一个记录在一个轮询组中被运行,SCAN字段必须被设置成I/O Intr。如果你想要使用不同于默认轮询组外的轮询组,你可以使用PG参数指定这个要使用的轮询组(见:章节5.4.1 "PG -- 指定一个轮询组")。
附录A:新的东西
A:版本3.0.0把与PLC通信的支持库从libnodave切换成了Snap7。对于使用EPICS设备支持的大多数程序,这种变化应该是完全透明的。仅在你编写直接使用来自libnodave的函数的C/C++代码时,你将必须转移此代码为Snap7。
在版本3.0.0中第二个主要变化是s7nodave现在使用来自C++ 11的特性,所以你将需要一个至少支持那个版本C++的编译器。取决于你的编译器,你必须显式地启用对C++ 11的支持(某些编译器默认仍然预计C++ 03)。切换到C++ 11,使得我们能够删除对Boost库的依赖,这使得编译这个设备支持更简单。
PLC中DB是数据块:
数据块是一组按顺序连续排列在一起的几组记录,是主存储器与输入、输出设备或外存储器之间进行传输的一个数据单位。是数据的物理记录,与数据的逻辑记录(逻辑上有联系,在存储器上占有一组邻接单元的数据单位)之间的对应关系有3种方式:
- ①一个块即为一个记录;
- ②一个块包含若干个逻辑记录;
- ③一个逻辑记录占有几个块。
数据块的大小可以是固定的或是可变的,块与块之间有间隙。设计数据块大小,受到多方面因素的影响,包括输入、输出效率,存储空间代价以及计算机应用特点等。
主存与cache都划分成长度相等的数据块,每次主存与cache交换数据时都是以数据块为单位进行的。