openplc Linux 地址映射io,读写驱动数据等使用记录

1. 上一篇记录 openplc使用C语言文件读写驱动实现基本流程。

        openPLC_Editor C语言编程 在mp157 arm板上调用io等使用记录_openplc c 编程-CSDN博客

2.  下面通过映射地址的方式控制io和读写驱动数据。

        在runtime 环境的 hardware 硬件配置中 选择 python on Linux(PSM),这个可以通过python编程把openplc的地址和硬件控制结合起来。上层读写地址就能控制io。比如 QX0.0 写寄存器0或1 控制led灯开关。

 3. python编程 地址映射

       3.1 import psm ,导入psm库,可以读写内部地址。

        qx00 = psm.get_var("QX0.0") 读取QX0.0的寄存器值,在openplc_editor中定义变量设置QX0.0 = 1,就可以qx00 = psm.get_var("QX0.0")读的值就是1。

        psm.set_var("IX0.0", 1)给 IX0.0的寄存器赋值1,在openplc_editor中定义IX0.0的变量就可以读取。

        3.2 在编辑框内默认代码有两个函数,update_inputs() 和 update_outputs()。

update_outputs() : 读取上层代码的输出变量,%QX0.0, %QW0之类的变量。比如 

         qx00 = psm.get_var("QX0.0") 判断QX0.0的值,=1 开灯, =0 关灯。

         qx01 = psm.get_var("QX0.1")判断QX0.1的值,=1 gpio0置1,=0 gpio0置0。

         qw00 = psm.get_var("QW0")读QW0的值,16位INT,设置DAC的输出值。

 update_inputs()  :设置上层代码的输入变量,%IX0.0,%IW0之类的变量。比如

         psm.set_var("IX0.0", int(var_str)) 先读取gpio10的电平值,然后赋值给 %IX0.0 寄存器,上层代码读 %IX0.0就能 得到 gpio10的电平值。

        psm.set_var("IW2", int(float(adc_value)*100)) 先读adc的采样值,float类型,*100变成int 赋值给 %IW2。上层代码就可以读 %IW2 得到adc的采样值。

4. python编程 驱动读写

        还是跟C语言编程一样使用文件操作来读写驱动。如下 读写adc的驱动文件,获取采样值,换算成电压值。

 5.完整代码,最好在notpad++之类的编辑器编好在复制过去。

#import all your libraries here
import psm
import time
import os

#global variables
cnt = 0
var_str = ""
def hardware_init():
    #Insert your hardware initialization code in here
    psm.start()
    f_led = open('/sys/class/leds/user-led/trigger','w')
    f_led.write("none")
    f_led.close()
    
    f_dac = open('/sys/bus/iio/devices/iio:device1/out_voltage1_powerdown','w')
    f_dac.write("0")
    f_dac.close()
    
    if not os.path.exists('/sys/class/gpio/gpio0'):
        f_io0 = open('/sys/class/gpio/export','w')
        f_io0.write("0")
        f_io0.close()
        f_in0 = open('/sys/class/gpio/gpio0/direction','w')
        f_in0.write("out")
        f_in0.close()
    
    if not os.path.exists('/sys/class/gpio/gpio10'):
        f_io10 = open('/sys/class/gpio/export','w')
        f_io10.write("10")
        f_io10.close()
        f_in10 = open('/sys/class/gpio/gpio10/direction','w')
        f_in10.write("in")
        f_in10.close()

def adc_read():
    f_raw = open('/sys/bus/iio/devices/iio:device0/in_voltage19_raw','r')
    f_raw.seek(0,0)
    str_raw = f_raw.read()
    f_raw.close()
    f_scale = open('/sys/bus/iio/devices/iio:device0/in_voltage_scale','r')
    f_scale.seek(0,0)
    str_scale = f_scale.read()
    f_scale.close()
    return float(str_raw)*float(str_scale)/1000.0
    
def dac_set( set ):
    if set >=0 and set <=4095:
        f_dac = open('/sys/bus/iio/devices/iio:device1/out_voltage1_raw','w')
        f_dac.write(str(set))
        f_dac.close()
    
    
def update_inputs():
    #place here your code to update inputs
    global cnt
    global var_str
    cnt += 1
    if (cnt == 2):
        cnt = 0
        f = open('/sys/class/gpio/gpio10/value','r')
        var_str = f.read()
        f.close()
        psm.set_var("IX0.0", int(var_str))
        #print(var_str)
        
        adc_value = adc_read()
        psm.set_var("IW2", int(float(adc_value)*100))
        #print(int(float(adc_value)*100));
    
def update_outputs():
    #place here your code to work on outputs
    qx00 = psm.get_var("QX0.0")
    if qx00 == True:
        os.system("echo 1 > /sys/class/leds/user-led/brightness")
    elif qx00 == False:
        os.system("echo 0 > /sys/class/leds/user-led/brightness")
    
    qx01 = psm.get_var("QX0.1")
    if qx01 == True:
        os.system("echo 1 > /sys/class/gpio/gpio0/value")
    elif qx01 == False:
        os.system("echo 0 > /sys/class/gpio/gpio0/value")
        
    qw00 = psm.get_var("QW0")
    if qw00 >=0 and qw00 <=4095:
        dac_set(qw00)

if __name__ == "__main__":
    hardware_init()
    while (not psm.should_quit()):
        update_inputs()
        update_outputs()
        time.sleep(0.1) #You can adjust the psm cycle time here
    psm.stop()

 5.在openplc_editer 上层代码 变量定义

 6.代码读写测试

         tcpGet 是 modbus %QW1 写地址,通过网络调试助手连接502端口就可以发送。

发送 “00 00 00 00 00 06 01 06 00 01 00 01” 设置 tcpGet 变量 = 1,

发送 “00 00 00 00 00 06 01 06 00 01 00 02” 设置 tcpGet 变量 = 2,

        如果 tcpGet == 1,

               ledSet :=1 点灯,

               gpioSet :=1 设置gpio0置1,

               dacSet :=1024 设置dac的值=1024,0.8V

               gpioRead0 := gpioRead 读取gpio10的电平值。

               adcRead0 := adcRead 读取adc的值

                打印值。

发送 “00 00 00 00 00 06 01 06 00 01 00 01”,gpio10 =1,adc=0.82v

发送 “00 00 00 00 00 06 01 06 00 01 00 02” ,gpio10 =0,adc=2.47v

  • 28
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在VS2015中使用OPCUA Open62541通过Kepware读写PLC数据需要按照以下步骤进行操作: 1. 安装Kepware软件:首先,需要从Kepware官网下载并安装Kepware软件。安装完成后,启动Kepware。 2. 配置Kepware:在Kepware中,需要配置OPCUA服务器以与PLC进行通信。根据PLC的型号和网络设置,设置适当的连接和通信参数。 3. 下载Open62541库:从Open62541项目的GitHub页面下载Open62541库的源代码。 4. 设置VS2015:打开VS2015并创建一个新的C++项目。在项目属性中,设置正确的包含路径和库文件路径,以便能够引用Open62541库。 5. 编写代码:在VS2015中编写C++代码来实现通过OPCUA Open62541访问PLC数据的功能。代码需要包含Open62541库的头文件,并使用相应的函数来实现与OPCUA服务器的连接、读取和写入PLC数据的操作。 6. 编译和运行:编译代码并运行程序。如果一切顺利,程序应该能够与Kepware建立连接,并能够读取和写入PLC数据。 需要注意的是,确保在编写代码时,按照Open62541库的文档和示例进行操作。此外,还需要了解PLC数据结构和通信协议,并根据实际情况进行相应的配置和参数设置。 ### 回答2: 在VS2015中使用OPCUA open62541库通过Kepware读写PLC数据,需要按照以下步骤进行操作。 首先,确保已经安装了VS2015和Kepware软件,并成功配置了PLC设备。 1. 下载open62541库并解压缩,然后在VS2015中创建一个新的C++项目。 2. 将open62541库中的源文件添加到项目中,包括open62541.c和open62541.h。 3. 在项目设置中配置附加包含目录,确保可以找到open62541.h文件。 4. 创建一个新的源文件,命名为main.cpp,并在其中包含open62541.h头文件。 5. 在main.cpp中编写代码,首先要连接到Kepware服务器。可以使用opcua_client_create函数创建一个OPC UA客户端对象,并使用opcua_client_connect函数连接到Kepware服务器。 6. 连接成功后,可以使用opcua_client_create_subscription函数创建一个订阅对象,并使用opcua_subscription_add_monitored_item函数添加一个监视项。监视项允许读取和写入PLC数据。 7. 使用opcua_subscription_activate函数激活订阅。 8. 使用opcua_read_value和opcua_write_value函数读写PLC数据。这些函数需要提供节点的标识符,可以使用Kepware提供的OPC UA浏览器工具查找节点标识符。 9. 最后,使用opcua_client_disconnect函数断开与Kepware服务器的连接。 总结起来,通过在VS2015中使用OPCUA open62541库,我们可以创建一个OPC UA客户端,连接到Kepware服务器,创建订阅并添加监视项来读写PLC数据。希望以上步骤能对你有所帮助。 ### 回答3: Visual Studio 2015是一种集成开发环境(IDE),用于开发应用程序。OPC-UA(OPC Unified Architecture)是一种开放式、跨平台、工业自动化通信协议,用于实现工业设备之间的互操作性。open62541是一个开源的OPC-UA库,用于在C和C++应用程序中实现OPC-UA通信。而Kepware是一种常用的OPC服务器软件,用于将PLC和其他设备连接到OPC系统。 要在VS2015中使用open62541通过Kepware读写PLC数据,需要按照以下步骤进行操作: 1. 下载并安装open62541库:从open62541项目的官方网站(https://open62541.org/)下载最新版本的库,并按照指南进行安装。 2. 创建一个新的C或C++项目:在VS2015中创建一个新的空项目,并将open62541库添加到项目中。 3. 编写OPC-UA客户端代码:使用open62541库的API函数编写代码,配置连接到Kepware的OPC-UA客户端。这些代码将实现与PLC的通信,并读取和写入PLC数据。可以使用open62541库提供的函数来连接到OPC服务器、读取和写入节点的数据等。 4. 编译和运行代码:在VS2015中编译和运行代码,确保代码能够成功连接到Kepware OPC服务器并读写PLC数据。 总结来说,使用VS2015和open62541通过Kepware读写PLC数据,需要下载和安装open62541库,并在VS2015中创建一个新的项目。然后编写OPC-UA客户端代码,使用open62541库的API函数来实现与Kepware的连接和数据读写。最后,编译和运行代码,确保代码能够成功连接到OPC服务器并实现PLC数据读写
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值