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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

成为先进企业应该从用飞书开始,还是应该从裁员开始?

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 大家都觉得飞书不行了&#xff0c;我们反而不这么看。 众所周知&#xff0c;飞书最近裁员的消息在业界引起了巨大的反响&#xff0c;大…

基于SSM+Jsp+Mysql的快递管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

62、服务攻防——框架安全CVE复现SpringStrutsLaravelThinkphp

文章目录 常见语言开发框架&#xff08;主流&#xff09;&#xff1a; PHP&#xff1a;ThinkPHP、Laravel、YIIJAVA&#xff1a;Spring、SpringbootPython&#xff1a;FlaskJavaScript&#xff1a;Vue.js、Node.js 框架判断()&#xff1a; 通过插件Wappalyzer&#xff08;可能…

练手项目层初阶1—《详解静态版本——通讯录管理系统》

文章目录 &#x1f6a9;前言&#x1f50a; 项目需求&#x1f4da; 项目知识点包含&#x1f9e9;项目框架&#x1f4dd;框架拆解分析✨Struct_book.h 头文件解析✨Struct_book.c文件解析✨test_book.c文件解析 &#x1f4fa;演示效果&#x1f680;完整代码 &#x1f6a9;前言 俗…

联想 Y9000P 连接网线速度慢 的 问题解决

参考帖子&#xff1a;求助&#xff0c;拯救者Y9000P 2022 i73060版本 有线网非常慢 无线网正常【笔记本吧】_百度贴吧 问题原因&#xff1a; 网卡驱动版本不对。不能用Win11版&#xff0c;要用Win10版。 问题解决&#xff1a; 1、卸载原驱动 2、下载Win10 驱动 并安装 下载…

C语言——常用库函数的使用及模拟实现

C语言编译系统为使用者提供了很多的预定义库函数。用户在编写程序时&#xff0c;可以直接调用这些库函数。这里选择了一些常用的库函数&#xff0c;简单介绍各个函数的使用方法&#xff1a; 字符串函数 字符串函数函数分为长度不受限制的字符串函数&#xff0c;和长度受限制的…

手搓链表(java)(不完整)

手搓链表&#xff08;java&#xff09;&#xff08;不完整&#xff09; 文章目录 手搓链表&#xff08;java&#xff09;&#xff08;不完整&#xff09;前言一、代码1.MyLinkedList类&#xff1a;2.测试类&#xff1a; 总结 前言 提示&#xff1a;以下是本篇文章正文内容&…

Git 术语及中英文对照

完毕&#xff01;&#xff01;感谢您的收看 ----------★★历史博文集合★★---------- 我的零基础Python教程&#xff0c;Python入门篇 进阶篇 视频教程 Py安装py项目 Python模块 Python爬虫 Json Xpath 正则表达式 Selenium Etree CssGui程序开发 Tkinter Pyqt5 列表元组字…

保姆级教程——VLAN综合实验(不同VLAN通过动态路由访问外网)

前言&#xff1a; 部署了VLAN的传统交换机不能实现不同VLAN间的二层报文转发&#xff0c;因此必须引入路由技术来实现不同VLAN间的通信。VLAN路由可以通过二层交换机配合路由器来实现&#xff0c;也可以通过三层交换机来实现 VLAN间通信的限制 每个VLAN都是一个独立的…

vue 使用自定义标签URL Protocol 调用本地exe 并传参

创建注册表文件reg&#xff0c;并运行 里面的路径需要替换成实际exe的绝对路径 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\App] "URL:App Protocol Handler" "URL Protocol""" [HKEY_CLASSES_ROOT\App\DefaultIcon] &qu…

启动mysql

删除C:\Program Files (x86)\MySQL\MySQL Server 5.7这个路径下的data文件夹&#xff0c;这个很难删除&#xff0c;因为一开机&#xff0c;mysql的某些服务就启动了&#xff0c;每次重新启动mysql之前&#xff0c;都要删除这个文件夹 因为这个文件夹在后端执行一些我们看不到的…

pycharm打包python文件为exe文件(图文教程)

1.安装pyinstaller库 pip3 install pyinstaller 2.使用pyinstaller 打包文件 首先确保Terminal命令行中&#xff0c;你的路径和你的项目是同一个路径 我的项目就是放在golden_dev中的。 3.命令行内输入打包代码 pyinstaller -F -w gold_miner.py gold_miner.py 是我的项目…

HomePlug AV

目录 HomePlug AV的基本概念基本术语网络概念网络实例 HomePlug AV物理层&#xff08;PHY&#xff09;HomePlug AV OFDM收发器架构PHY的调制模式FC调制和ROBO调制物理层的特点OFDM频域/时域转换开窗/槽式OFDM信号和噪声PHY发送控制——信道自适应PHY帧格式&#xff08;Symbol&a…

微软邮箱被锁住,该如何解除限制?

ChatGPT账号是微软邮箱注册的&#xff0c;我们在登陆微软邮箱时&#xff0c;http://www.outlook.com&#xff0c;不需要开魔法工具&#xff0c;直接就可以登陆&#xff0c;否则会出现安全验证&#xff0c;限制登陆。 那么如果账号被锁&#xff0c;我们该如何解除限制呢&#x…

目标检测——监控下的汽车

一、重要性及意义 首先&#xff0c;车辆检测技术是保证视频监控系统正常运行的基础。通过监控摄像头实时获取的图像&#xff0c;可以自动检测出图像中的车辆&#xff0c;并进行车辆类型的分类和识别。这对于优化城市交通管理、实现智能交通系统具有重要意义。此外&#xff0c;…

【LeetCode热题100】51. N 皇后(回溯)

一.题目要求 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方…

渐进式图片解决前端在页面中使用大图,图片体积过大导致页面出现白屏现象

1、演示 可以看到&#xff0c;图片还在拼命加载的时候&#xff0c; 页面上就已经有内容了 2、什么渐进式图片 图片一开始是模糊的&#xff0c;然后逐渐的开始变的清晰。如果页面上有一些大图&#xff0c;如果直接扔给浏览器的话那么图片的传输时间就会比较长&#xff0c;用户就…

fastadmin学习08-查询数据渲染到前端

index.php查询&#xff0c;这个是前台的index.php public function index() {$slideImgs Db::name("slideimg")->where("status",,normal)->limit(5)->order(sort,desc)->select();$productList Db::name("product")->where(…

windows10 上安装 docker

windows 10 上安装 docker 官方目前给的方案是利用 Docker Desktop 来安装 docker 环境 一、安装前准备工作 1.1 检查系统要求 Windows 10 64 位&#xff1a;Home 或 Pro 2004&#xff08;内部版本 19041&#xff09;或更高版本&#xff0c;或者 Enterprise 或 Education 1…

每日一题————P5725 【深基4.习8】求三角形

题目&#xff1a; 题目乍一看非常的简单&#xff0c;属于初学者都会的问题——————————但是实际上呢&#xff0c;有一些小小的坑在里面。 就是三角形的打印。 平常我们在写代码的时候&#xff0c;遇到打印三角形的题&#xff0c;一般简简单单两个for循环搞定 #inclu…