一. 前言

大部分主流品牌商编程时采用ST语言,如施耐德PLC等。ST是结构化文本编程,类似于C语言,不同于梯形图和顺序函数功能表。它的优点就是能简化复杂的数学方程,进行梯形图所难以执行的复杂计算,完成程式的建立;

少部分品牌商编程时采用C语言,可以通过C语言子函数调用的方式,加入到梯形图的体系中,主要起到辅助作用,它主要解决复杂的数字方程,解决梯形图无法达到的运算速度和效率,解决梯形图编程过于复杂的问题,用C语言编程可提高程序效率,如CRC校验,复杂浮点数运算,多项式函数运算,凸轮参数设置等

梯形图就是为了逻辑控制而产生的语言,平时大家用没必要死磕ST,ST在逻辑控制的直观性上肯定是不如梯形图,而ST在数据处理上的优势也很明显,所以各有所长,灵活运用即可,最重要的是白猫黑猫做出稳定设备的才是好猫.管你啥语言,干就完事.

二.轴运动功能块设计

1.运动控制需要的变量的建立

然后将这些变量放在一个结构体里面

这个轴控制结构体,包含配置,100个点位,报警,自动控制变量,手动控制变量,状态反馈

在全局变量在声明要使用轴变量,有几个轴就声明几个

参数配置可以用触摸屏直接访问相关变量设置即可

如设置0号轴的Jog速度

2.功能块设计--梯形图和ST混编

功能块输入输出

3.功能块设计--纯ST

注意:以下ST写未经测试

注意ST语言的上升沿下降沿是要自己写的

//手动使能IF Sys_Manual AND  NOT tempMaualServoOn AND Axis.MaualControl.ServoOn AND NOT MaualServoOnLastSta THENtempMaualServoOn:=TRUE;END_IF;手动使能延时器(tempMaualServoOn,T#0.1s,手动使能置位延时,ET);IF (Axis.MaualControl.ServoOn AND  MaualServoOnLastSta=FALSE AND 手动使能置位延时 )OR(Axis.AutoControl.ServoOn AND  AutoServoOnLastSta=FALSE)OR(Axis.Status.Error AND  ErrorLastSta=FALSE) THEN tempMaualServoOn:=FALSE;END_IF;AutoServoOnLastSta:=Axis.AutoControl.ServoOn;MaualServoOnLastSta:=Axis.MaualControl.ServoOn;ErrorLastSta:=Axis.Status.Error;//使能IF EStop THENIF Sys_Manual  THENPower_On(Axis.Config.sAXIS_REF,tempMaualServoOn,FunctionStatus,FunctionBusy,FunctionError,FunctionErrorID);ELSEPower_On(Axis.Config.sAXIS_REF,Axis.AutoControl.ServoOn,FunctionStatus,FunctionBusy,FunctionError,FunctionErrorID);END_IF;END_IF;//使能状态Axis.Status.ServoOn:=Axis.Config.sAXIS_REF.DrvStatus.ServoOn;//复位Axis.AutoControl.Reset:=Reset;IF Axis.Config.sAXIS_REF.MFaultLvl.Active THENIF Axis.AutoControl.Reset OR Axis.MaualControl.Reset THEN Error_Reset(         Axis.Config.sAXIS_REF,TRUE,FunctionDone,FunctionBusy,FunctionStatus,Axis.Error.ResetError,FunctionErrorID);END_IF;END_IF;//回零IF Axis.Status.ServoOn AND Axis.Config.Home_Interlock THEN IF Sys_Manual THENHome(Axis.Config.sAXIS_REF, Axis.MaualControl.StartHardHome, FunctionDone, HomeBusy, Axis.Error.HHomeCommandAbortedError, Axis.Error.HardHomeError, FunctionErrorID );ELSEHome(Axis.Config.sAXIS_REF, Axis.AutoControl.StartHardHome, FunctionDone, HomeBusy, Axis.Error.HHomeCommandAbortedError, Axis.Error.HardHomeError, FunctionErrorID );END_IF;END_IF;//回零状态Axis.Status.Homing:=Axis.Config.sAXIS_REF.Status.Homing;Axis.Status.HardHomed:=Axis.Config.sAXIS_REF.Details.Homed;//限位状态IF NOT Axis.Status.Homing AND NOT HomeBusy AND Axis.Config.sAXIS_REF.DrvStatus.P_OT  THEN    Axis.Status.HardPositiveSignal:=TRUE;ELSIF Axis.Status.HardPositiveSignal AND ( Axis.MaualControl.Reset OR Axis.AutoControl.Reset )THENAxis.Status.HardPositiveSignal:=FALSE;END_IF;IF NOT Axis.Status.Homing AND NOT HomeBusy AND Axis.Config.sAXIS_REF.DrvStatus.N_OT  THENAxis.Status.HardNegativeSignal:=TRUE;ELSIF Axis.Status.HardNegativeSignal AND ( Axis.MaualControl.Reset OR Axis.AutoControl.Reset )THENAxis.Status.HardNegativeSignal:=FALSE;END_IF;//JOGIF Axis.Status.ServoOn THENIF NOT Axis.Status.HardPositiveSignal THEN    IF  NOT  Sys_Manual AND Axis.AutoControl.JogPositive AND NOT  Axis.AutoControl.JogNegative THEN    tempJogPositive:=TRUE;ELSIF Sys_Manual AND Axis.MaualControl.JogPositive AND  NOT Axis.MaualControl.JogNegative THENtempJogPositive:=TRUE;ELSEtempJogPositive:=FALSE;END_IF;END_IF;IF NOT Axis.Status.HardNegativeSignal THENIF NOT Sys_Manual AND Axis.AutoControl.JogNegative AND NOT Axis.AutoControl.JogPositive THENtempJogNegative:=TRUE;ELSIF Sys_Manual AND Axis.MaualControl.JogNegative AND NOT  Axis.MaualControl.JogPositive THENtempJogNegative:=TRUE;ELSEtempJogNegative:=FALSE;END_IF;END_IF;END_IF;JOG(Axis.Config.sAXIS_REF,tempJogPositive,tempJogNegative,Axis.Config.Jog_velocity,Axis.Config.Manual_AccDec,Axis.Config.Manual_AccDec,FunctionBusy,FunctionAborted,Axis.Error.JogError,FunctionErrorID);//停止IF (MoveAbsoluteBusy OR MoveRelativeBusy) AND  NOT Axis.Config.Move_Interlock THENStop(     Axis.Config.sAXIS_REF, TRUE, 10000, 10000, BuffMode, FunctionDone,stopBusy, FunctionActive, FunctionAborted, Axis.Error.StopError, FunctionErrorID );ELSIF (HomeBusy OR MoveSoftZeroBusy) AND  NOT Axis.Config.Home_Interlock THENStop(     Axis.Config.sAXIS_REF, TRUE, 10000, 10000, BuffMode, FunctionDone,stopBusy, FunctionActive, FunctionAborted, Axis.Error.StopError, FunctionErrorID );ELSIF MoveAbsoluteBusy OR MoveRelativeBusy OR HomeBusy OR MoveSoftZeroBusy THENIF  NOT  Sys_Manual AND Axis.AutoControl.StopMove THENStop(     Axis.Config.sAXIS_REF, TRUE, 10000, 10000, BuffMode, FunctionDone,stopBusy, FunctionActive, FunctionAborted, Axis.Error.StopError, FunctionErrorID );ELSIF  Sys_Manual  AND Axis.MaualControl.StopMove THENStop(     Axis.Config.sAXIS_REF, TRUE, 10000, 10000, BuffMode, FunctionDone,stopBusy, FunctionActive, FunctionAborted, Axis.Error.StopError, FunctionErrorID );END_IF;END_IF;//绝对位移速度坐标设置IF Sys_Manual=TRUE THENtempDistance:=Axis.Config.Manual_RelativeMove_Pulse;tempPos:=Axis.Config.Manual_AbsoluteMovePulse;tempVel:=Axis.Config.Manual_velocity;tempAccDec:=Axis.Config.Manual_AccDec;tempJerk:=Axis.Config.Manual_jerk;ELSEtempDistance:=Axis.Config.Auto_RelativeMove_Pulse;tempPos:=Axis.Position_Table[PosIndex].Auto_AbsoluteMovePulse;tempVel:=Axis.Position_Table[PosIndex].Auto_AbsoluteMoveVelocity;tempAccDec:=Axis.Position_Table[PosIndex].Auto_AbsoluteMoveAccDec;tempJerk:=Axis.Position_Table[PosIndex].Auto_AbsoluteMoveJerk;END_IF;//移动限制,碰到极限只能往反方向移动IF Axis.Status.HardPositiveSignal =TRUE AND tempPos>0 THENtempAbsCondition:=FALSE;ELSIF Axis.Status.HardNegativeSignal =TRUE AND tempPos<0 THENtempAbsCondition:=FALSE;ELSEtempAbsCondition:=TRUE;END_IF;IF Axis.Status.HardPositiveSignal =TRUE AND tempDistance>0 THEN        tempRelCondition:=FALSE;ELSIF Axis.Status.HardNegativeSignal =TRUE AND tempDistance<0 THEN    tempRelCondition:=FALSE;ELSE     tempRelCondition:=TRUE;END_IF;//绝对位移IF Axis.Config.Move_Interlock AND Axis.Status.ServoReady AND tempAbsCondition THENIF NOT Sys_Manual THENMoveAbsolute(Axis.Config.sAXIS_REF,Axis.AutoControl.AbsoluteMove,tempPos,tempVel,tempAccDec,tempAccDec,tempJerk,Direction,BuffMode,FunctionDone,MoveAbsoluteBusy,FunctionActive,Axis.Error.AbsCommandAbortedError,Axis.Error.AbsoluteMoveError,FunctionErrorID);ELSEMoveAbsolute(Axis.Config.sAXIS_REF,Axis.MaualControl.AbsoluteMove,tempPos,tempVel,tempAccDec,tempAccDec,tempJerk,Direction,BuffMode,FunctionDone,MoveAbsoluteBusy,FunctionActive,Axis.Error.AbsCommandAbortedError,Axis.Error.AbsoluteMoveError,FunctionErrorID);END_IF;END_IF;//相对位移IF Axis.Config.Move_Interlock AND Axis.Status.ServoReady AND tempRelCondition THENIF NOT  Sys_Manual THENMoveRelative(         Axis.Config.sAXIS_REF, Axis.AutoControl.RelativeMove, tempDistance,tempVel,tempAccDec, tempAccDec,tempJerk,BuffMode, FunctionDone, MoveRelativeBusy, FunctionActive, FunctionAborted, Axis.Error.RelativeMoveError, FunctionErrorID );ELSEMoveRelative(         Axis.Config.sAXIS_REF, Axis.MaualControl.RelativeMove, tempDistance,tempVel,tempAccDec, tempAccDec,tempJerk,BuffMode, FunctionDone, MoveRelativeBusy, FunctionActive, FunctionAborted, Axis.Error.RelativeMoveError, FunctionErrorID );END_IF;END_IF;//软回零IF Axis.Config.Home_Interlock AND Axis.Status.ServoReady THENIF NOT Sys_Manual THENMoveSoftZero(Axis.Config.sAXIS_REF,Axis.AutoControl.StartSorftHome,Axis.Config.Manual_velocity,Axis.Config.Manual_AccDec,Axis.Config.Manual_AccDec,Axis.Config.Manual_jerk,BuffMode,FunctionDone,MoveSoftZeroBusy,FunctionActive,Axis.Error.SHomeCommandAbortedError,Axis.Error.SorftHomeError,FunctionErrorID);ELSEMoveSoftZero(Axis.Config.sAXIS_REF,Axis.MaualControl.StartSorftHome,Axis.Config.Manual_velocity,Axis.Config.Manual_AccDec,Axis.Config.Manual_AccDec,Axis.Config.Manual_jerk,BuffMode,FunctionDone,MoveSoftZeroBusy,FunctionActive,Axis.Error.SHomeCommandAbortedError,Axis.Error.SorftHomeError,FunctionErrorID);END_IF;END_IF;//位置到位检测FOR i:=0 TO SizeOfAry(Axis.Position_Table) BY 1 DOtempFirstPos:=Axis.Position_Table[i].Auto_AbsoluteMovePulse-PosCheckValue;tempLastPos:=Axis.Position_Table[i].Auto_AbsoluteMovePulse+PosCheckValue;Axis.Position_Table[i].Auto_InPositionedMark:=ZoneCmp(tempFirstPos,Axis.Config.sAXIS_REF.Act.Pos,tempLastPos);END_FOR;//轴运动Busy检测SvonBusy:=MoveAbsoluteBusy OR HomeBusy OR MoveSoftZeroBusy OR MoveRelativeBusy;IF SvonBusy AND  SvonBusyLastSta=FALSE THENAxis.AutoControl.AbsoluteMove:=FALSE;    Axis.AutoControl.StartSorftHome:=FALSE;    Axis.AutoControl.RelativeMove:=FALSE;   Axis.AutoControl.StartHardHome:=FALSE;END_IF;SvonBusyLastSta:=SvonBusy;//伺服状态Axis.Status.ServoIdle:=Axis.Config.sAXIS_REF.Details.Idle;Axis.Status.ServoReady:=NOT SvonBusy                                         AND Axis.Status.ServoIdleAND Axis.Status.HardHomed AND Axis.Status.ServoOnAND NOT Axis.Status.AlarmingAND NOT Axis.Status.ErrorAND NOT Axis.AutoControl.StopMove;IF Axis.Status.ErrorCode=WORD#16#6440 THENAxis.Status.SoftPositiveSignal:=TRUE;ELSIF Axis.Status.ErrorCode=WORD#16#6441 THENAxis.Status.SoftNegativeSignal:=TRUE;ELSEAxis.Status.SoftPositiveSignal:=FALSE;Axis.Status.SoftNegativeSignal:=FALSE;END_IF;Axis.Status.EncoderPos:=LREAL_TO_REAL(Axis.Config.sAXIS_REF.Act.Pos);Axis.Status.CommandPos:=LREAL_TO_REAL(Axis.Config.sAXIS_REF.Cmd.Pos);//软回零状态确定IF  MoveSoftZeroBusy THENAxis.Status.SorftHomed:=FALSE;END_IF;IF  NOT MoveSoftZeroBusy AND MoveSoftZeroBusyLastSta THENIF Axis.Status.EncoderPos<0.5 AND Axis.Status.EncoderPos>-0.5 AND Axis.Status.HardHomed THENAxis.Status.SorftHomed:=TRUE;    ELSEAxis.Status.SorftHomed:=FALSE;END_IF;END_IF;MoveSoftZeroBusyLastSta:= MoveSoftZeroBusy;//报警检测IF  Axis.Config.sAXIS_REF.MFaultLvl.Active THEN Axis.Status.ErrorCode:=Axis.Config.sAXIS_REF.MFaultLvl.Code;Axis.Status.Error:=TRUE;ELSIF Axis.Status.HardPositiveSignal THENAxis.Status.Error:=TRUE;ELSIF Axis.Status.HardNegativeSignal THENAxis.Status.Error:=TRUE;ELSEAxis.Status.Error:=FALSE;END_IF;Axis.Status.Alarming:=Axis.Config.sAXIS_REF.DrvStatus.DrvAlarm OR Axis.Config.sAXIS_REF.DrvStatus.DrvWarning;

三.功能块调用

 axisX:=0;   axisY:=1;   axisZ:=2;    axisR:=3;Z上料位:=0;     Z首片位:=1;R初始位:=0;     R取片位:=1;    R放片位:=2;Y初始位:=0;      Y整形位:=1; X初始位:=0;     X预取料位:=1;         X取料位:=2;     X物料整形位:=3;Axis[axisX].Config.sAXIS_REF:=MC_Axis000;Axis[axisY].Config.sAXIS_REF:=MC_Axis001;Axis[axisZ].Config.sAXIS_REF:=MC_Axis002;Axis[axisR].Config.sAXIS_REF:=MC_Axis003;

四.程序中使用

使能

回零

运动

自由落体运动c语言编程_欧姆龙NX PLC 轴运动功能块,ST和梯形图双语言相关推荐

  1. c语言二级编程实例,二级C语言编程_-实例.doc

    二级C语言编程_-实例.doc 编程实例 ? 1.???????? 1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位.十位.个位的数字都是1.2.3. ...

  2. 换硬币c语言编程_如何才能成为编程高手?别人都不告诉你的东西,我来说给你听...

    在IT行业摸爬滚打十几年的应该知道,下面简单说说关于编程需要掌握的技术与相关知识.很多人感觉编程很难.很多人问我,我英语不好,数学不好能做编程吗? 我非常肯定的说,能做编程.编程的领域很广泛.细分出来 ...

  3. 换硬币c语言编程_为什么大多数程序员都会学C语言的5大原因!什么原因让你学不会?...

    一.c语言,不朽的传奇 从30年前到如今,一些流行的科技媒体上发表的编程语言排行榜,c语言始终稳定位于前三位,这是其他一种其他的编程语言都达不到的.c语言的江湖地位,不容撼动.虽历史悠久,却也是不朽的 ...

  4. 《C语言编程魔法书:基于C11标准》——1.3 主流C语言编译器介绍

    本节书摘来自华章计算机<C语言编程魔法书:基于C11标准>一书中的第1章,第1.3节,作者: 陈轶 更多章节内容可以访问云栖社区"华章计算机"公众号查看. 1.3 主流 ...

  5. 使用c语言编程首先要新建,【C语言编程入门系列】—— 第三章,编写第一个C语言程序!...

    导读:一般学一门计算机语言的第一堂上机课("上机"顾名思义,上计算机,机你太美),就是往屏幕输出"hello world",本章也不例外. 3.1 Hello, ...

  6. c语言编程上升沿怎样写,plc结构化编程怎么写

    1.PLC如何编程 要看什么类型的PLC,有三菱的.西门子的 有以下几种编程方法: 梯形图编程语言(LD) 指令语句表编程语言(IL) 功能块图编程语言(FBD) 顺序功能图编程(SFC) 结构化文本 ...

  7. idea怎么进行c语言编程_编程入门-C语言开发IDE选择

    上一篇文字:https://www.jianshu.com/p/40133cfcd9e3,笔者和大家分享了数据结构和算法的慨念,笔者用写作和写程序做了类比,写文章需要有文章组织结构和写作方法以更好的表 ...

  8. st语言 数组的常用方法_欧姆龙cp1h常用指令学习(九)结构化语言ST

    结构化语言ST是作用于功能块编程中. 这门语言对于梯形图中不善于处理的数值运算等逻辑算法,采用类似于高级语言的语法,使其变得简单. 下面先从功能块的相关知识说起: CP1H的功能块规格: 功能块定义数 ...

  9. 猜数游戏c语言编程_做游戏,学编程(C语言) 10 僵尸危机

    这个案例,分享14级同学大一时实现的打僵尸小游戏,电脑点击下图可以看到动图效果: 这个案例的代码不复杂,但是结合了游戏角色的动画效果.射击声音特效,实现后还是挺酷的.对应的游戏素材.分步骤代码,可从百 ...

  10. idea怎么进行c语言编程_怎么进行C语言编程,要全代码

    展开全部 #include main() { 32313133353236313431303231363533e59b9ee7ad9431333332643238char goods[4][20] = ...

最新文章

  1. Apache Tiles 学习(四)、Tiles实战
  2. nginx的负载均衡
  3. Tomcat 最新版安装与使用手册,tomcat更改端口号方法,tomcat控制台乱码问题解决方法
  4. Go语言简单的TCP编程
  5. codevs 3054 高精度练习-文件操作
  6. 【搜索引擎基础知识1】搜索引擎的技术架构
  7. 数据结构实验之栈八:栈的基本操作
  8. 自定义带标尺的seekbar
  9. 医保费用监控指标体系建立(九)其他专项分析
  10. 人工智能与自动驾驶汽车_自动驾驶汽车中的道德AI
  11. windows10:检测windows defender是不是已经连接到了云安全中心
  12. 不离不弃共赴鸿蒙是什么歌,很早听过一首粤语歌,歌词好像是往往世界这么大 又可以遇到你 蛮经典的一首歌 求解答...
  13. mjs无法访问ftp文件解决
  14. 【PTA】【Python】【拼题A 2022 跨年挑战赛】太神奇了
  15. 2022-2028全球超声波封管机行业调研及趋势分析报告
  16. 如何整合线上和线下营销进行深度交融
  17. apex语言与java比较_Apex 基础知识合辑
  18. wordpress配置SSL证书
  19. 20个数据分析师必会的营销模型,赶紧收藏
  20. 魔兽怀旧服务器维护副本是否重置,魔兽世界怀旧服副本重置时间 魔兽世界怀旧服副本重置时间详解...

热门文章

  1. PLSQL提示动态执行表不可访问,本会话的自动统计被禁止问题的解决
  2. Mobile First! Wijmo 5 之 架构
  3. 【转载】jQuery框架
  4. vue运行报错:Cannot find module 'webpack/bin/config-yargs'
  5. vscode生成vue模板快捷键_VSCode 初次写vue项目并一键生成.vue模版
  6. python下载问题_初学者下载使用Python遇到的问题看它就行了
  7. c语言贪吃蛇游戏的关键技术,C语言的贪吃蛇游戏设计
  8. 重构java和js版_重构Javascript代码示例(重构前后对比)
  9. Yii Framework2.0开发教程(9)运行机制概述
  10. 2019年三峡大学计算机考研名单,三峡大学2019硕士研究生复试录取方案