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 herepsm.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.0def 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 inputsglobal cntglobal var_strcnt += 1if (cnt == 2):cnt = 0f = 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 outputsqx00 = 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 herepsm.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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

柱状图中最大的矩形-java

题目描述(力扣题库 84): 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 解题思想: 单调栈: 利用先进后出的思想, 先算出长度更高的柱子所能勾勒…

MXNet的下载安装及问题处理

1、MXNet介绍&#xff1a; MXNet是一个开源的深度学习框架&#xff0c;以其灵活性和效率著称&#xff0c;支持多种编程接口&#xff0c;包括Python、C、R、Julia、Scala等。MXNet支持大规模分布式训练&#xff0c;同时兼顾CPU和GPU的计算资源&#xff0c;尤其擅长于模型并行和数…

1.0-spring入门

文章目录 前言一、版本要求二、第一个spring程序1.引入pom2.代码部分2.1 spring bean2.2 springContext.xml2.3 测试2.4 执行结果 总结 前言 最近想要系统的学习下spring相关的框架,于是乎,来到了B站(真是个好地方),spring会专门开一个专栏出来,记录学习心得,与大家共勉。 Spri…

实景三维技术在推进城市全域数字化转型的作用

4月2日&#xff0c;国家数据局发布《深化智慧城市发展推进城市全域数字化转型的指导意见&#xff08;征求意见稿&#xff09;》&#xff08;下称&#xff1a;《指导意见》&#xff09;&#xff0c;向社会公开征求意见。 《指导意见》作为推进城市数字化转型的重要文件&#xf…

Java学习笔记24(面向对象编程(高级))

1.面向对象编程(高级) 1.1 类变量和类方法 1.类变量 ​ *类变量也叫静态变量/静态属性&#xff0c;是该类的所有对象共享的变量&#xff0c;任何一个该类的对象去访问它时&#xff0c;取到的都是相同的值&#xff0c;同样任何一个该类的对象去修改它时&#xff0c;修改的也是…

C语言数据结构(11)——归并排序

欢迎来到博主的专栏C语言数据结构 博主ID&#xff1a;代码小豪 文章目录 归并排序两个有序数组的合并归并归并排序 归并排序的代码 归并排序 两个有序数组的合并 当前有两个有序数组arr1和arr2&#xff0c;我们创建一个可以容纳arr1和arr2同等元素个数的新数组arr。 让一个…

探索数据结构:特殊的双向队列

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 双向队列的定义 **双向队列(double‑ended queue)**是一种特殊的队列…

js中使let关键字报错,改用var关键字解决

js中使let关键字报错,改用var关键字解决 项目场景&#xff1a;问题描述原因分析&#xff1a;解决方案&#xff1a;总结 项目场景&#xff1a; 使用 let 关键字报错&#xff0c;报错信息为&#xff1a; Uncaught ReferenceError: maxNum is not defined at getMaxNum (4-3.htm…

Open-GroundingDino和GroundingDino的推理流程实现

1、简单介绍 GroundingDino是一个多模态检测模型&#xff0c;可以输入文本提示输出视觉目标的位置&#xff0c;实现了文本和图像的匹配。相比较于一众的OVD算法&#xff0c;GroundingDino在文本处理上的灵活度高&#xff0c;因为大多OVD算法是采用clip文本编码器&#xff0c;这…

Stable Diffusion介绍

Stable Diffusion是一种前沿的开源深度学习模型框架&#xff0c;专门设计用于从文本描述生成高质量的图像。这种称为文本到图像生成的技术&#xff0c;利用了大规模变换器&#xff08;transformers&#xff09;和生成对抗网络&#xff08;GANs&#xff09;的力量&#xff0c;以…

7(8)-2-CSS 盒子模型

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 CSS 盒子模型1 盒子模型&#xff08;Box Model&#xff09;组成2 边框&#x…

软考程序员2024年5月报名流程及注意事项

2024年5月软考程序员报名入口&#xff1a; 中国计算机技术职业资格网&#xff08;http://www.ruankao.org.cn/&#xff09; 2024年软考报名时间暂未公布&#xff0c;考试时间上半年为5月25日到28日&#xff0c;下半年考试时间为11月9日到12日。不想错过考试最新消息的考友可以…

多线程4

死锁 想获取到第二把锁&#xff0c;就需要执行完第一层大括号&#xff0c;想要执行完第一层大括号&#xff0c;就要先获取到第二层的锁。 synchronized (counter2){ synchronized (counter2){} } 例子:t2先启动&#xff0c;t2进行加锁后一定成功&#xff0c;但是如果t2进行二…

图数据库技术:知识图谱的存储与查询

图数据库技术&#xff1a;知识图谱的存储与查询 一、引言 在探索知识的宇宙中&#xff0c;知识图谱是组织和理解海量信息的星系图。在这张图中&#xff0c;每一个概念、实体与事物不再是孤立的点&#xff0c;而是通过关系与边相互连接&#xff0c;形成一个复杂而有机的网络。图…

计算机网络练习-计算机网络概述与性能指标

计算机网络概述 ----------------------------------------------------------------------------------------------------------------------------- 1. 计算机网络最据本的功能的是( )。 1,差错控制 Ⅱ.路由选择 Ⅲ,分布式处理 IV.传输控制 …

3.网络编程-TCP

目录 TCP 建立连接的过程是怎样的 TCP为什么是三次握手 TCP 断开连接的过程是怎样的 TCP挥手为什么需要四次 为什么TIME_WAIT等待的时间是2MSL TCP详解之滑动窗口 TCP 半连接队列和全连接队列是什么 TCP粘包&#xff0c;拆包是怎么发生的&#xff0c;如何解决 TCP是如何…

书生·浦语大模型实战营之茴香豆:搭建你的 RAG 智能助理

书生浦语大模型实战营之茴香豆&#xff1a;搭建你的 RAG 智能助理 RAG&#xff08;Retrieval Augmented Generation&#xff09;技术&#xff0c;通过检索与用户输入相关的信息&#xff0c;并结合外部知识库来生成更准确、更丰富的回答。解决 LLMs 在处理知识密集型任务时可能遇…

高项-进度管理

成本管理就是要确保项目在批准的预算内完成。 成本的类型 成本的组成 项目成本管理储备成本基准&#xff08;需要经过批准才能进行变更&#xff09; 成本基准应急储备工作包成本&#xff08;在基准内的可以不经过批准变更&#xff09; 工作包成本活动成本活动应急储备&…

物联网实战--驱动篇之(三)LoRa(sx1278)

目录 一、LoRa简介 二、sx1278模块 三、硬件抽象层 四、SX1278初始化 五、发送时间计算 六、发送模式 七、接收模式 八、总结 一、LoRa简介 LoRa在物联网传输领域有着举足轻重的地位&#xff0c;平时大家可能比较少听说&#xff0c;因为它主要还是在行业应用&#xff0…

C语言整数和小数的存储

1.整数在内存中的存储 计算机使用二进制进行存储、运算&#xff0c;整数在内存中存储使用的是二进制补码 1.1原码、反码、补码 整数的2进制表⽰⽅法有三种&#xff0c;即 原码、反码和补码 三种表⽰⽅法均有符号位和数值位两部分&#xff0c;符号位都是⽤0表⽰“正”&am…