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

news2024/10/11 9:14:48

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

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

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

相关文章

Redis常用命令补充和持久化

一、redis 多数据库常用命令 1.1 多数据库间切换 1.2 多数据库间移动数据 1.3 清除数据库内数据 1.4 设置密码 1.4.1 使用config set requirepass yourpassword命令设置密码 1.4.2 使用config get requirepass命令查看密码 二、redis高可用 2.1 redis 持久化 2.1.1 持…

PS从入门到精通视频各类教程整理全集,包含素材、作业等(7)复发

PS从入门到精通视频各类教程整理全集&#xff0c;包含素材、作业等 最新PS以及插件合集&#xff0c;可在我以往文章中找到 由于阿里云盘有分享次受限制和文件大小限制&#xff0c;今天先分享到这里&#xff0c;后续持续更新 PS敬伟01——90集等文件 https://www.alipan.com/s…

日历插件fullcalendar【前端】

日历插件fullcalendar【前端】 前言版权开源推荐日历插件fullcalendar一、下载二、初次使用日历界面示例-添加事件&#xff0c;删除事件 三、汉化四、动态数据五、前后端交互1.环境搭建-前端搭建2.环境搭建-后端搭建3.代码编写-前端代码fullcalendar.htmlfullcalendar.js 4.代码…

vue项目引入微信sdk: npm install weixin-js-sdk --save报错

网上查到要用淘宝的镜像 同事告知旧 域名&#xff1a;https://registry.npm.taobao.org/已经不能再使用 使用 npm config set registry http://registry.npmmirror.com

DTFT及其反变换的直观理解

对于离散时间傅里叶变换(DTFT)及其反变换的讲解&#xff0c;教材里通常会先给出DTFT正变换的公式&#xff0c;再举个DTFT的简单变换例子&#xff0c;推导一下DTFT的性质&#xff0c;然后给出DTFT反变换的公式&#xff0c;再证明一下正变换和反变化的对应关系。总的来说就是&…

MySQL版本特性和存储引擎选择

MySQL版本特性和存储引擎选择 1.说一下MySQL 5.5 5.6 5.7 8.0 各个版本的特性 MySQL 5.5 优点: 稳定性&#xff1a;5.5版本是长期支持&#xff08;LTS&#xff09;版本&#xff0c;因此它非常稳定&#xff0c;被广泛部署在生产环境中。兼容性&#xff1a;与旧版本的MySQL和…

索引的概念

索引的概念    1.索引是一种可选的与表相关的数据库对象&#xff0c;用于提高数据的查询效率。    2.索引是一种有序的数据结构。    3.如果一个表没有创建索引&#xff0c;则对该表进行查询时需要进行全表扫描&#xff1b;如果创建了索引&#xff0c;则在有条件查询时…

http模块 设置资源类型(mime类型)

虽然浏览器自带websocket功能它会根据响应回来的内容自动去判断资源类型&#xff0c;但是我们加上了mime类型判断代码会更加规范些 一、mime类型概念&#xff1a; 媒体类型是一种标准&#xff0c;它用来表示文档。文件、字节流的性质和格式。HTTP服务可以设置响应头Content-T…

WebKit简介

1、简介&#xff08;WebKit&#xff09; WebKit 是一个开源的浏览器引擎&#xff0c;最初由苹果公司基于KHTML&#xff08;K Desktop Environment的HTML渲染引擎&#xff09;开发&#xff0c;并广泛应用于Safari浏览器&#xff0c;后来也被其他多款浏览器和应用采用。WebKit负…

【管理咨询宝藏48】AA银行信息科技提升分析报告

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏48】AA银行信息科技提升分析报告 【格式】PPT版本&#xff0c;可编辑 【关键词】战略规划、商业分析、管理咨询 【强烈推荐】这是一套市面上非常…

【介绍什么是DDOS】

&#x1f308;个人主页:程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

Swin_transformer模型解析

目录 •1、网络整体框架 •2 、Patch Merging •3 、W-MSA MSA模块计算量 W-MSA模块计算量 •4、 SW-MSA •5 、Relative Position Bias •1、网络整体框架 •2 、Patch Merging 这里看着挺复杂&#xff0c;其实就相当于先对特征图进行LayerNorm&#xff0c;然后再进行一…

PDF编辑和格式转换工具 Cisdem PDFMaster for Mac

Cisdem PDFMaster for Mac是一款功能强大的PDF编辑和格式转换工具。它为用户提供了直观且易于使用的界面&#xff0c;使常用功能触手可及&#xff0c;从而帮助用户轻松管理、编辑和转换PDF文件。 软件下载&#xff1a;Cisdem PDFMaster for Mac v6.0.0激活版下载 作为一款完整的…

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…

【深度学习】图像自然语言描述生成

案例 6&#xff1a;图像自然语言描述生成&#xff08;让计算机“看图说话”&#xff09; 相关知识点&#xff1a;RNN、Attention 机制、图像和文本数据的处理 1 任务目标 1.1 任务和数据简介 ​ 本次案例将使用深度学习技术来完成图像自然语言描述生成任务&#xff0c;输入…

鸿蒙实战开发-通过输入法框架实现自绘编辑框

介绍 本示例通过输入法框架实现自会编辑框&#xff0c;可以绑定输入法应用&#xff0c;从输入法应用输入内容&#xff0c;显示和隐藏输入法。 效果预览 使用说明 1.点击编辑框可以绑定并拉起输入法&#xff0c;可以从输入法键盘输入内容到编辑框。 2.可以点击attach/dettac…

【单片机家电产品学习记录--蜂鸣器】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 单片机家电产品–蜂鸣器 前言 记录学习单片机家电产品内容 已转载记录为主 一、知识点 1电子电路学习笔记&#xff08;17&#xff09;——蜂鸣器 蜂鸣器种类和原理 2疑…

【无限列车1】SpringCloudAlibaba 与 SpringBoot后端架构的搭建

【无限列车1】SpringCloudAlibaba 与 SpringBoot后端架构的搭建 1、版本说明二、日志相关配置3、AOP 打印日志4、下载开源前端后台管理系统5、添加网关模块6、集成数据库和mp(1) 添加驱动和mp依赖(2) 数据库配置(3) 使用MybatisPlus 7、加密 yaml 文件中的内容(1) 依赖(2) 敏感…

GraalVM运行模式和企业级应用

文章目录 GraalVM运行模式JIT模式AOT模式 GraalVM的问题和解决方案GraalVM企业级应用传统架构的问题Serverless架构函数计算Serverless应用场景Serverless应用 GraalVM内存参数 GraalVM运行模式 JIT模式 JIT&#xff08; Just-In-Time &#xff09;模式 &#xff0c;即时编译模…

Leetcode-894-所有可能的真二叉树-c++

题目详见https://leetcode.cn/problems/all-possible-full-binary-trees/ 主搞动态规划&#xff0c;因为这玩意儿我还不是很懂 关于节点个数为奇数偶数的证明请见官方题解方法一中的如下内容&#xff1a; 这里DP的一个主要思想是&#xff1a;对于任何一个满二叉树&#xff…