S7-1500 读取V90/S120/S210/G120的常用驱动参数
S7-1500 读取V90/S120的常用驱动参数
此程序已更新,可以下载例子程序
https://files.cnblogs.com/files/lion-zheng/PLC_async_drive.zip
1
不需要理解非周期通讯,调用这个FB就可以读取常用的驱动状态,程序块已经封装了非周期通讯功能。
故障代码、报警代码、扭矩、电流、直流母线电压、电机温度、驱动器温度
功率、转速
本文地址
http://www.cnblogs.com/lion-zheng/p/7853852.html
非周期通讯参考资料可在在西门子中文下载中心 搜索 非周期
http://www.ad.siemens.com.cn/download/
2
此功能块的输入管脚
name | type | datatype | description |
---|---|---|---|
Hardware_ID | in | HW_IO | Profinet/Profibus网络标识ID * |
Drive_Number | in | int | V90/CU310 = 1, G120 = 2 |
Pulse | in | bool | 连接5HZ或2.5HZ的脉冲信号 |
V90 | in | bool | 区分驱动类型,V90 = 1, cu310 = 0 |
*HardwareID是以上参数中比较特别的一个,可以在TIA portal的Device configuration
中找到。
如果一个设备有两个HardwareID,那么很可能,两个都可以用。
HardwareID也可以在TIA portal的Tags -> Default tag table -> System constants
中找到。
功能块的输出管脚
name | type | datatype | description |
---|---|---|---|
FaultNumber | out | DINT | 故障代码 |
AlarmNumber | out | DINT | 报警代码 |
ActualTorque | out | real | 扭矩 |
ActualCurrent | out | real | 电流 |
DCvoltage | out | real | 直流母线电压 |
MotorTemp | out | real | 电机温度 |
DriveTemp | out | real | 驱动器温度 |
ActualPower | out | real | 电机实际功率 |
ActualRPM | out | real | 电机实际转速 |
功能块的调用效果,2个V90,1个CU310,可见只有HardwareID管脚略有不同
至此为止,你应该已经知道了此FB的功能和使用方法。下文是一些程序内部实现的细节。
3
在编写此程序块时,发现一个 WRREC 和 RDREC 程序块的特点。
当我们读取参数时,需要先调用WRREC来发送命令给驱动器,WRREC会返回Done信号。然而这个Done信号只保证了发送完成,并无法确认驱动已经准备好。因此我们需要延时一段时间,等待驱动准备好数据。V90需要大约50ms,S120需要30ms。延时后,再调用RDREC。发现此问题感谢我们的朋友 @内存1KB
的提醒。
1)正确的状态,WRREC之后,立即发送RDREC,出现故障
- 正确的时序,WRREC之后,延时50ms,再发送RDREC,没有故障
4
程序的细节
- 定义报文头
- 定义每一个需要读取的参数
- 调用WRREC
- 延时,并调用RDREC
- 输出变量到FB接口
//Telegram head
#write_record[0] := #task;
#write_record[1] := 01;//01 read-task, 02 write-task
#write_record[2] := INT_TO_BYTE(#Drive_Number);
#write_record[3] := 16#9;//number of parameter
//Parameter1 r2131 (16#853) fault number
#write_record[4] := 16#10;
#write_record[5] := 16#01;//number of index
#write_record[6] := 16#8;//parameter number
#write_record[7] := 16#53;//parameter number
#write_record[8] := 16#0;//first index number = 0
#write_record[9] := 16#0;//first index number = 0
//Parameter2 r2132 (16#854) alarm number
#write_record[10] := 16#10;
#write_record[11] := 16#01;//number of index
#write_record[12] := 16#8;//parameter number
#write_record[13] := 16#54;//parameter number
#write_record[14] := 16#0;//first index number = 0
#write_record[15] := 16#0;//first index number = 0
//Parameter3 r31 (16#1F) actual torque smoothed
#write_record[16] := 16#10;
#write_record[17] := 16#01;//number of index
#write_record[18] := 16#0;//parameter number
#write_record[19] := 16#1F;//parameter number
#write_record[20] := 16#0;//first index number = 0
#write_record[21] := 16#0;//first index number = 0
//Parameter4 r26 (16#1A) DC voltage smoothed
#write_record[22] := 16#10;
#write_record[23] := 16#01;//number of index
#write_record[24] := 16#0;//parameter number
#write_record[25] := 16#1A;//parameter number
#write_record[26] := 16#0;//first index number = 0
#write_record[27] := 16#0;//first index number = 0
//Parameter5 r27 (16#1B) ActualCurrent
#write_record[28] := 16#10;
#write_record[29] := 16#01;//number of index
#write_record[30] := 16#0;//parameter number
#write_record[31] := 16#1B;//parameter number
#write_record[32] := 16#0;//first index number = 0
#write_record[33] := 16#0;//first index number = 0
//Parameter6 r21 (16#15) ActualRpm
#write_record[34] := 16#10;
#write_record[35] := 16#01;//number of index
#write_record[36] := 16#0;//parameter number
#write_record[37] := 16#15;//parameter number
#write_record[38] := 16#0;//first index number = 0
#write_record[39] := 16#0;//first index number = 0
//Parameter7 r32 (16#20) ActualPower
#write_record[40] := 16#10;
#write_record[41] := 16#01;//number of index
#write_record[42] := 16#0;//parameter number
#write_record[43] := 16#20;//parameter number
#write_record[44] := 16#0;//first index number = 0
#write_record[45] := 16#0;//first index number = 0
//Parameter8 r35 (16#23) MotorTemp
//Parameter8 r632 (16#278)
#write_record[46] := 16#10;
#write_record[47] := 16#01;//number of index
IF #v90 THEN
#write_record[48] := 16#2;//parameter number
#write_record[49] := 16#78;//parameter number
ELSE
#write_record[48] := 16#0;//parameter number
#write_record[49] := 16#23;//parameter number
END_IF;
#write_record[50] := 16#0;//first index number = 0
#write_record[51] := 16#0;//first index number = 0
//Parameter9 r37 (16#25) DriveTemp
#write_record[52] := 16#10;
#write_record[53] := 16#01;//number of index
#write_record[54] := 16#0;//parameter number
#write_record[55] := 16#25;//parameter number
#write_record[56] := 16#0;//first index number = 0
#write_record[57] := 16#0;//first index number = 0
#R_TRIG_Instance(CLK:=#Pulse);
#WRREC_REQ := #R_TRIG_Instance.Q AND NOT #WRREC_BUSY AND NOT #REREC_BUSY;
#WRREC_Instance(REQ:=#WRREC_REQ,
ID:=#Hardware_ID,
INDEX:=47,
DONE=>#WRREC_DONE,
BUSY=>#WRREC_BUSY,
ERROR=>#WRREC_ERROR,
STATUS=>#WRREC_STATUS,
RECORD:= #write_record);
#IEC_Timer_0_Instance(IN := #Pulse,
PT := T#100MS);
//#R_TRIG_Instance_1(CLK := #IEC_Timer_0_Instance.Q,
// Q => #REREC_REQ);
#REREC_REQ := #WRREC_DONE;
#RDREC_Instance(REQ:= #REREC_REQ,
ID:= #Hardware_ID,
INDEX:= 47,
VALID=> #REREC_VALID,
BUSY=> #REREC_BUSY,
ERROR=> #REREC_ERROR,
STATUS=> #REREC_STATUS,
RECORD:= #read_record);
//byte 0,1,2,3 telegram head
//byte 4,5,6,7 ,parameter 1 ,r2131,fault code
"Tag_23" := #read_record[6];
"Tag_24" := #read_record[7];
#FaultNumber := WORD_TO_DINT("Tag_25");
//byte 8,9,10,11 ,parameter 2,r2132,alarm code
"Tag_23" := #read_record[10];
"Tag_24" := #read_record[11];
#AlarmNumber := WORD_TO_DINT("Tag_25");
//byte 12,13,14,15,16,17 ,parameter 3, r31 actual torque
"Tag_23" := #read_record[14];
"Tag_24" := #read_record[15];
"Tag_26" := #read_record[16];
"Tag_27" := #read_record[17];
#ActualTorque := "Tag_28";
//byte 18,19,20,21,22,23 ,parameter 4, r26 DC voltage
"Tag_23" := #read_record[20];
"Tag_24" := #read_record[21];
"Tag_26" := #read_record[22];
"Tag_27" := #read_record[23];
#DCvoltage := "Tag_28";
//byte 24,25,26,27,28,29 ,parameter 5, r27 actual current
"Tag_23" := #read_record[26];
"Tag_24" := #read_record[27];
"Tag_26" := #read_record[28];
"Tag_27" := #read_record[29];
#ActualCurrent := "Tag_28";
//byte 30,31,32,33,34,35 ,parameter 6, r21 actual RPM
"Tag_23" := #read_record[32];
"Tag_24" := #read_record[33];
"Tag_26" := #read_record[34];
"Tag_27" := #read_record[35];
#ActualRPM := "Tag_28";
//byte 36,37,38,39,40,41 ,parameter 7, r32 actual POWER
"Tag_23" := #read_record[38];
"Tag_24" := #read_record[39];
"Tag_26" := #read_record[40];
"Tag_27" := #read_record[41];
#ActualPower := "Tag_28";
//byte 42,43,44,45,46,47 ,parameter 8, r35 MOTOR TEMP
"Tag_23" := #read_record[44];
"Tag_24" := #read_record[45];
"Tag_26" := #read_record[46];
"Tag_27" := #read_record[47];
#MotorTemp := "Tag_28";
//byte 48,49,50,51,52,53 ,parameter 9, r35 MOTOR TEMP
"Tag_23" := #read_record[50];
"Tag_24" := #read_record[51];
"Tag_26" := #read_record[52];
"Tag_27" := #read_record[53];
#DriveTemp := "Tag_28";
S7-1500 读取V90/S120/S210/G120的常用驱动参数的更多相关文章
- python学习笔记3.1_数据读取常用函数参数
一.read_table/read_csv常用函数参数 1.path:表明文件系统位置的字符串.url或文件型对象 2.sep或delimiter:用于分隔每行字段的字符序列或正则表达式 3.head ...
- Sharepoint 问题集锦 - 外部列表(external list) - 读取当前用户上下文或用户名作为筛选参数
在创建外部列表过程中,往往需要添加筛选参数,而较多开发用户,会关心如何在外部列表中,只显示当前用户相关的行.本例子中,我们以任务数据表来做例子,看看如何实现这个需求. 1)数据表tbl_task: t ...
- Php连接及读取和写入mysql数据库的常用代码
在这里我总结了常用的PHP连接MySQL数据库以及读取写入数据库的方法,希望能够帮到你,当然也是作为我自己的一个回顾总结. 1.为了更好地设置数据连接,一般会将数据连接所涉及的值定义成变量. $mys ...
- OpenCV计算机视觉学习(1)——图像基本操作(图像视频读取,ROI区域截取,常用cv函数解释)
1,计算机眼中的图像 我们打开经典的 Lena图片,看看计算机是如何看待图片的: 我们点击图中的一个小格子,发现计算机会将其分为R,G,B三种通道.每个通道分别由一堆0~256之间的数字组成,那Ope ...
- WPF RichTextBox读取存储文本的方法和常用属性
1. 取得已被选中的内容: (1)使用 RichTextBox.Document.Selection属性(2)访问RichTextBox.Document.Blocks属性的“blocks”中的Tex ...
- Web应用运行原理
web应用启动做了什么? 读取web.xml文件 - web.xml常用配置参数: 1).context-param(上下文参数)2).listener(监听器配置参数)3).filter(过滤器 ...
- C# 读写西门子PLC数据,包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC
本文将使用一个gitHub开源的组件技术来读写西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 官方 ...
- python 读写西门子PLC 包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC
本文将使用一个gitHub开源的组件技术来读写西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 nu ...
- java android 读写西门子PLC数据,包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC
本文将使用一个gitHub开源的组件技术来读写西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 gi ...
随机推荐
- 74th LeetCode Weekly Contest Number of Subarrays with Bounded Maximum
We are given an array A of positive integers, and two positive integers L and R (L <= R). Return ...
- Go语言基础之12--Channel
一.不同goroutine之间如何进行通讯? 1.全局变量和锁同步 缺点:多个goroutine要通信时,定义太多的全局变量(每个全局变量功能不一样),不好维护 2.Channel 二.channel ...
- Ancient Messages UVA - 1103
题目链接:https://vjudge.net/problem/UVA-1103 题目大意:每组数据包含H行W列的字符矩阵(H<=200,W<=50) 每个字符为为16进制 你需要把它转 ...
- 为什么我用gets不行呢?系统无视了我的存在!!!
梗概:为什么我用gets不行呢?系统无视了我的存在!!!我还没输入东东啊..怎么就提示[请安任意键继续]的?? 原来是缓冲区的问题啊? 一.什么是缓冲区 缓冲区又称为缓存,它是内存空间的一部分.也就是 ...
- 性能测试工具LoadRunner05-LR之Virtual User Generator html模式与url模式
“HTML-based script”说明 在默认情况下,选择“HTML-based script”,说明脚本中采用HTML页面的形式来表示,这种方式的脚本容易维护,容易理解,推荐这种方式录制 “UR ...
- Murano Weekly Meeting 2016.07.26
Meeting time: 2016.July.26 1:00~2:00 Chairperson: Nikolay_St, from Mirantis Meeting summary: 1.Masc ...
- 关于get_magic_quotes_gpc()函数(交互数据转义的判断)
在PHP中get_magic_quotes_gpc()函数是内置的函数,这个函数的作用就是得到php.ini设置中magic_quotes_gpc选项的值. 那么就先说一下magic_quotes_g ...
- plsql窗口列表保持
使用plsql窗口列表保持方法如下: 1.工具——首选项——用户界面——自动保存桌面 选一下此项就保存你当前的窗口布局了,下次启动就不用再设置了. 英语版自己对照.
- [HZOI 2015]复仇的序幕曲
[题目描述] 你还梦不梦痛不痛,回忆这么重你怎么背得动 ----序言 当年的战火硝烟已经渐渐远去,可仇恨却在阿凯蒂王子的心中越来越深 他的叔父三年前谋权篡位,逼宫杀死了他的父王,用铁血手腕平定了国内所 ...
- 导入的项目eclipse出现乱码的处理方法
如果这样子还是出现乱码无法解决的话,则删掉当前项目重新开始项目.