EPICS S7nodave手册

news2024/12/30 2:51:59

第一章:介绍

本手册分为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.DBDBn.DB

数据块(n必须是一个整数数值)

FM标记
IE输入内存映像
QA输出内存映像
TT计时器
CZ计数器

对于数据块地址,数据块数值必须被包含在这个区域格式中。对于使用数据块,标记,输入内存和输出内存区的地址,你接着必须指定(应该被从其读取或者被写入到其)内存宽度。用于指定这个宽度的标记是:

表格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数据类型和它们对应的内存宽度

数据类型内存宽度描述
bool1位布尔
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交换数据时都是以数据块为单位进行的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/389712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法】期末复盘,酒店住宿问题——勿向思想僵化前进

文章目录前言题目描述卡在哪里代码(C)前言 省流:一个人也可以住双人间,如果便宜的话。 害!尚正值青春年华,黄金岁月,小脑瓜子就已经不灵光咯。好在我在考试的最后一分钟还是成功通过了这题&am…

Jetpack Compose 中的 CompositionLocal

要在可组合函数之间共享数据时,可以通过参数传递显式地调用,这通常是最简单和最好的方式。 但随着参数越来越多,组件也越来越多,并且有些数据还需要保持私有性,这时这种方式就会显得很繁琐臃肿,难以维护。…

vscode插件推荐

文章目录前言一、vscode插件推荐?1、 Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code2、Auto Close Tag3、Auto Import3、Error Lens4、vscode-icons5、ES7 React/Redux/React-Native snippets6、GitLens — Git supercharged7、JavaScript…

【FPGA】Verilog:时序电路应用 | 序列发生器 | 序列检测器

前言:本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:序列发生器与序列检测器 ​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片 配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度 存储器…

车道线检测CondLaneNet论文和源码解读

CondLaneNet: a Top-to-down Lane Detection Framework Based on Conditional Convolution Paper:https://arxiv.org/pdf/2105.05003.pdf code:GitHub - aliyun/conditional-lane-detection 论文解读: 一、摘要 这项工作作为车道线检测任…

js垃圾回收机制

内存的生命周期 ]S环境中分配的内存,一般有如下生命周期 1.内存分配:当我们声明变量、函数、对象的时候,系统会自动为他们分配内存 2.内存使用:即读写内存,也就是使用变量、函数等 3.内存回收: 使用完毕,由垃圾回收器自动回收不再…

MySQL实战解析底层---事务到底是隔离的还是不隔离的

目录 前言 “快照”在 MVCC 里是怎么工作的? 更新逻辑 前言 讲事务隔离级别的时候提到过,如果是可重复读隔离级别,事务 T 启动的时候会创建一个视图 read-view之后事务 T 执行期间,即使有其他事务修改了数据,事务 T…

​ ​​ ​IIS之FTP服务器 部署 (图文详细) 千锋

目录 概述 部署 步骤: 二重新配置FTP服务器 概述 1、File Transfor Protocol 文件传输协议 2、端口号: TCP 20/21 3、工作方式: 1)主动模式 2)被动模式 部署 步骤: 配置静态IP 安装IIS-ftp软件 使用默认站…

学python的第三天---基础(1)

一、圆的面积print("A{:.4f}".format(s))二、两点间的距离![在这里插入图片描述](https://img-blog.csdnimg.cn/0d07c41d856d470796c79067b78c41b6.png)写法一:写法二:三、钞票和硬币写法一:写法二:四、倍数在python中实…

Spring Aware总结

概述 Spring中Aware到底是什么意思? 我们在看Spring源码的时候,经常可以看到xxxAwarexxx的身影,通常我会很疑惑,Aware到底是什么意思呢? 比如图片中这些包含Aware关键字的类或者接口。 我对下面3个类或接口进行了解…

【FMCW 02】测距

承接上篇博文 中频IF信号 ,我们已经知道得到的中频IF信号的形式为: xIF(t)A′′cos⁡(2πKτt2πfoτ)x_{\tiny{IF}}(t) A^{\prime \prime} \cos(2\pi K\tau t2\pi f_o \tau ) xIF​(t)A′′cos(2πKτt2πfo​τ) 其中时延τ2dc\tau \frac{2d}{c}τc2…

【数据库】15分钟了解TiDB

由于目前的项目把mysql换成了TiDb,所以特意来了解下tidb。其实也不能说换,由于tidb和mysql几乎完全兼容,所以我们的程序没有任何改动就完成了数据库从mysql到TiDb的转换,TiDB 是一个分布式 NewSQL (SQL 、 NoSQL 和 NewSQL 的优缺…

C++之空间配置器

目录 一、C语言中的类型转换 二、C的类型转换 三、C强制类型转换 static_cast reinterpret_cast const_cast volatile关键字 dynamic_cast 什么情况下需要将父转成子呢? static_cast与dynamic_cast转换对比 四、空间配置器 什么是空间配置器 为什么需要…

raspberry pi播放音视频

文章目录目的QMediaPlayerGStreamerwhat is GStreamer体系框架优势omxplayerwhat is omxplayercommand Linekey bindings运行过程中错误ALSA目的 实现在树莓派下外接扬声器, 播放某段音频, 进行回音测试。 QMediaPlayer 首先我的安装是5.11版本。 优先…

【并发编程二十一:终章】c++20协程( co_yield、co_return、co_await )

【并发编程二十一】c20协程(co_yield、co_return、co_await )一、协程分类1、控制机制划分2、有栈(stackfull)/无栈(stackless)划分二、c20协程三、co_yield1、demo2、相关知识点介绍四、co_return五、co_await一、协程分类 上一篇我们讲解了…

如何让AI帮你干活-娱乐(2)

背景:好容易完成朋友的任务,帮忙给小朋友绘画比赛生成一些创意参考图片。他给我个挑战更高的问题,是否可以帮他用AI生成一些视频。这个乍一听以现在AI技术根本不太可能完成。奈何他各种坚持,无奈被迫营业。苦脸接受了这个不可能完…

Java线程知识点总结

文章目录Java 线程基础线程简介什么是进程什么是线程进程和线程的区别创建线程ThreadRunnableCallable、Future、FutureTaskCallableFutureFutureTaskCallable Future FutureTask 示例线程基本用法线程休眠线程礼让终止线程守护线程线程通信wait/notify/notifyAlljoin管道线程…

MATLAB——数据及其运算

MATLAB数值数据数值数据类型的分类1.整型整型数据是不带小数的数,有带符号整数和无符号整数之分。表中列出了各种整型数据的取值范围和对应的转换函数。2.浮点型浮点型数据有单精度(single)和双精度((double)之分&…

精粤X99M-PLUS D3+ E5-2696 v3电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网,转载需注明出处。硬件型号驱动情况主板精粤X99M-PLUS D3处理器E5-2696 v3已驱动内存64GB ECC DDR3 1866MHz (16GB*4)已驱动硬盘TOPMORE CAPRICORNUS NVMe 1TB已驱动显卡AMD Radeon™ RX 570 series (4GB/MSI)已驱动声卡Realtek ALC897 英特…

Android framework系列2 - Init进程

1、源码 入口:system/core/init/main.cpp2 流程图 https://note.youdao.com/s/EtnCswft 3、代码详解 主入口共三步,如流程图所示,我们主要看下最后一步 入口在init.cpp下,这个阶段主要来解析init.rc并执行此文件下的命令 看到…