5.3.2动态链接库声明
程序中用到的PRODAVE 函数主要有:
⑴load_tool 函数用于PC 机与PLC 系统的初始化链接。
⑵unload_tool 函数用于断开PC 机与PLC 系统的链接。
⑶db_read 函数用于从PLC 的DB 块中读数据字。
⑷db_write 函数用于向PLC 的DB 块中写数据字。
首先,在模块中应该声明程序使用的用户自定义的数据类型PlcAdrType:
Type PlcAdrType
ADDRESS As Byte
SEGMENTID As Byte
SLOTNO As Byte
PACKNO As Byte
End Type
在通信开始之前,首先用load_tool 函数建立与上位机与PLC 的链接,通信结束时必须用unload_tool 函数断开PC 与PLC 的链接,否则会引起上位机死机或上位机系统的异常状况。VB 在调用DLL 函数之前,需要用Declare 语句在模块中声明所要使用的DLL 函数。
声明DLL 函数的主要作用是指明该函数所在的DLL 库名及路径,以及该函数的参数说明,以便Windows 能找到该函数,并能正确的执行该函数。
Declare Function load_tool Lib "w95_s7.dll" (ByVal nr As Byte, ByVal dev As String, adr As PlcAdrType) As Long
//nr 是PC 要激活的连接的个数(1-32 个);
//dev 是用户驱动设备的名称MPI 接口时为“S7ONLINE”;
//adr 是连接的地址列表;
Declare Function unload_tool Lib "w95_s7.dll" () As Long
//断开连接
Declare Function db_read Lib "w95_s7.dll" (ByVal blockno As Long, ByVal no As Long, Amount As Long, value As Byte) As Long
//读取DB 块号为blockno 中的从地址no 开始的Amount 个数据字。
//读取的数据存放于PC 的变量区value 中。
Declare Function db_write Lib "w95_s7.dll" (ByVal blockno As Long, ByVal no As Long, Amount As Long, value As Byte) As Long
//将PC 的变量存储区value 中的amount 个数据字写入到PLC 的数据块DB
中从no 开始的数据区。
5.3.3 读写函数使用的注意事项
我们在调试过程中曾发现读入的模拟量(双字)存在突然变小的情况,在排除硬件故障后,发现是由于VB 对于字符串的处理比较特殊而造成的错误结果。因此,在使用PRODAVE工具箱进行通信的程序中,要特别注意的是VB 在处理字符串时对“0”是自动舍弃的,现举例说明如下:
PIW292 是4~20mA 模拟量输入信号在PLC 中的地址PIW292 的数据类型是整数,经过数据转换存于DB1.DBD36 中,DB1.DBD36 的数据类型是双整数。转换的梯形图如图5.1 所示。
图5.1 模拟量转换为双整数的梯形图
在 VB 中执行下列语句:
Res = db_read(1, 36, 4, Buffer_R(0)) // Buffer_R()是字符串型数组
Res = db_read(1, 36, 4, Buffer_R(0))执行后,DB1.DBD36 中的数据被VB 读入到Buffer_R(0)~Buffer_R(3)中,将Buffer_R(0)~Buffer_R(3)中的String 型数据变为Single 型数据后,得到的即为PLC 上的传感器的数值。将将Buffer_R(0)~Buffer_R(3)中的String 型数据变为Single 型数据的方法如下:
Val=CSng(Buffer_R(0)+ Buffer_R(1)+ Buffer_R(2)+ Buffer_R(3))
Val 即为Single 型的模拟量采样结果。
假设DB1.DBD36 中数值为16 进制的“00003F12”,经过上述转换后,Val 的值为“00003F12”(16 进制),变为10 进制为“16146”。此时实际读入的结果是正确的。但是,当Buffer_R()中的字符串有“0”字符时:例如DB1.DBD36 中数值为16 进制的“00003F02”,Val 中的结果应该是16 进制的“00003F02 ”,即10 进制的“16130”。而实际读入的数值为10 进制的“1010”,比真实的模拟量信号变小了近16 倍!
为什么会出现如此错误的结果呢?原因如下:当传感器的真实值为“00003F02”时,
Buffer_R(0)=“00”;
- 上一篇:地铁隧道及站台无线覆盖方案
- 下一篇:基于OPNET的TCP协议研究与仿真
-
-
-
-
-
-
-
NFC协议物理层的软件实现+文献综述
浅析中国古代宗法制度
上市公司股权结构对经营绩效的影响研究
高警觉工作人群的元情绪...
中国传统元素在游戏角色...
现代简约美式风格在室内家装中的运用
C++最短路径算法研究和程序设计
巴金《激流三部曲》高觉新的悲剧命运
江苏省某高中学生体质现状的调查研究
g-C3N4光催化剂的制备和光催化性能研究