菜单
  

    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”;
  1. 上一篇:地铁隧道及站台无线覆盖方案
  2. 下一篇:基于OPNET的TCP协议研究与仿真
  1. LabVIEW+DataSocket远程支援系统设计

  2. FHA和PHA的交叉验证技术在...

  3. AT89C51单片机IIC总线的监控...

  4. 时延广义网络控制系统的建模与分析

  5. 多小区协作大规模MIMO系统的能效优化

  6. Matlab非线性时延网络控制...

  7. Stegblocks网络流块数据组合...

  8. NFC协议物理层的软件实现+文献综述

  9. 浅析中国古代宗法制度

  10. 上市公司股权结构对经营绩效的影响研究

  11. 高警觉工作人群的元情绪...

  12. 中国传统元素在游戏角色...

  13. 现代简约美式风格在室内家装中的运用

  14. C++最短路径算法研究和程序设计

  15. 巴金《激流三部曲》高觉新的悲剧命运

  16. 江苏省某高中学生体质现状的调查研究

  17. g-C3N4光催化剂的制备和光催化性能研究

  

About

优尔论文网手机版...

主页:http://www.youerw.com

关闭返回