菜单
  

    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. 无限冲激响应系统识别问题研究

  2. 光电系统近似模型研究

  3. PID控制在非线性时延离散混沌系统中的应用

  4. Arduino无线传感网络定位系统设计

  5. 基于混沌的图像加密通信...

  6. MPS模块化生产系统的开发及研究+PLC梯形图

  7. 数字化钢轨精细打磨装备4G无线通信系统设计

  8. java+mysql车辆管理系统的设计+源代码

  9. 十二层带中心支撑钢结构...

  10. 杂拟谷盗体内共生菌沃尔...

  11. 河岸冲刷和泥沙淤积的监测国内外研究现状

  12. 中考体育项目与体育教学合理结合的研究

  13. 电站锅炉暖风器设计任务书

  14. 乳业同业并购式全产业链...

  15. 当代大学生慈善意识研究+文献综述

  16. 大众媒体对公共政策制定的影响

  17. 酸性水汽提装置总汽提塔设计+CAD图纸

  

About

751论文网手机版...

主页:http://www.751com.cn

关闭返回