联系我们

联系人:黄勇(先生)

联系手机:13701633515

固定电话:31660605

企业邮箱:77956468@qq.com

联系我时,请说是在地方电气网上看到的,谢谢!

今日最新资讯
热门资讯
地方电气网资讯
    6SL32110KB137UA1
    发布者:黄工  发布时间:2016-04-10 13:44:22  访问次数:49

    6SL32110KB137UA1,6SL32110KB137UA1

                               {心中有空间,梦想就有可能}

                     {西门子与客户携手,让关键所在,逐一实现}

    联   系   人: 黄勇《黄工》   24小时联系手机:  13701633515
    直线销售 电 话: 021-31660605    在 线 商 务 QQ:  77956468 
    单位:台                                                                                  产品单价:电议

    供货数量:不限                                                                      最小定量:1

    包装说明:齐全                                                                      产品规格:全新原装

    WinCC中定时器使用方法介绍

    1、定时器功能介绍
    2、脚本中定时器介绍
    3、使用脚本实现更多定时器功能
    3.1 整点归档
    3.2 WinCC 项目激活时避免脚本初次执行及延迟执行脚本1 定时器功能介绍
        WinCC 中定时器的使用可以使 WinCC按照指定的周期或者时间点去执行任务,比如周期执行变量归档、在指定的时间点执行全局脚本或条件满足时打印报表。WinCC 已经提供了一些简单的定时器,可以满足大部分定时功能。但是在有些情况下,WinCC 提供的定时器不能满足我们需求,这时我们就可以通过 WinCC 提供的脚本接口通过编程的方式实现定时的功能,因为脚本本身既可以直接 调用 WinCC其他功能,比如报表打印,也可以通过中间变量来控制其他功能的执行,比如通过置位/复位归档控制变量来触发变量记录的执行。WinCC 提供了 C 脚本和 VBS 脚 本,本文主要以全局 C 脚本编程为例介绍定时功能的实现。
    2 脚本中定时器介绍     既然在全局脚本中可以编程控制其他功能的执行,那么首先看看全局脚本的触发:

    1
                             图1   脚本触发器分类 如图1所示: 脚本触发器分为使用定时器和使用变量, 定时器又分为周期执行和非周期执行一次,比如每分钟执行一次脚本属于周期执行,指定2012年10月1日执行一次属于非周期执行。 使用变量触发脚本,即在变量发生变化时,脚本就执行一次, 而变量的采集可以根据指定周期循环采集,或者根据变化采集,根据变化实际是1秒 钟采集变量一次。
    3使用脚本实现更多定时器功能
       利用脚本自身的定时器, 可以通过在脚本中编程的方式实现更多其它定时功能。

    3.1整 点归档

        WinCC提供了变量归档,变量归档分为周期归档和非周期归档,不管是周期归档或非周期的归档,都又可以通过一些 变量或脚本返回值来控制归档, 比如:整点归档。下面的设置结合WinCC脚本,实现了在 整点开始归档,归档五分种后停止归档,即每个小时仅归档前五分钟的数据。
        软件环境:Windows 7 Professional Service Pack1 , WinCC V7.0 SP3
        归档名称:ProcessValueArchive
        归档变量:NewTag
        归档周期:1 分钟
        归档控制变量  startarchive
        C脚本触发周期:10秒
        脚本代码:
    #include "apdefap.h"
    intgscAction( void )
    {
        #pragma option(mbcs)
        #pragma code ("kernel32.dll"); 
        void GetLocalTime (SYSTEMTIME* lpst); 
        #pragma code(); 
          SYSTEMTIME time;
          int  t1; 
          GetLocalTime(&time); 
          t1=time.wMinute; 
    if(t1==00) 
          { 
                      SetTagBit("startarchive",1);  
           } 
         if(t1==05) 
          { 
                      SetTagBit("startarchive",0);    
     } 
    return0;
    }
    归档设置如图2:

                         图2   归档设置
        同理,在以上脚本的基础上做修改,可以实现在某个指定的时间点打印报表,只要在满足触发条件时调用下列函数:    
           RPTJobPrint(" Myprintjob");
          Myprintjob为 事先创建好的打印作业。 
           脚 本主要部分在于获取系统当前时间,下 面的脚本实现了获取当前时间并分别获取年、月、日、时、分、秒、毫秒,星期几的功能。
     
        Varname1 到 Varname8 为 WinCC 内部变量。若在 WinCC画面上显示时,由于默认 I/O 域的 格式为999.99, 要把 Varname1 的显示格式改为9999。 
      #include "apdefap.h"
    intgscAction( void )
    {
              #pragma option(mbcs)
     
              #pragma code ("kernel32.dll"); 
                 void GetLocalTime (SYSTEMTIME* lpst); 
             #pragma code(); 
             SYSTEMTIME time;
                GetLocalTime(&time); 
                 SetTagWord("Varname1",time.wYear);
               SetTagWord("Varname2",time.wMonth);
               SetTagWord("Varname3",time.wDayOfWeek);
               SetTagWord("Varname4",time.wDay);
               SetTagWord("Varname5",time.wHour);
               SetTagWord("Varname6",time.wMinute);
               SetTagWord("Varname7",time.wSecond);
               SetTagWord("Varname8",time.wMilliseconds);
      return 0;
    }
        设置或读取系统时间的函数如下: 
            SetSystemTime
            SetLocalTime
            GetSystemTime
            GetLocalTime 
        系统中本地计算机时间和格林威治时间是有区别的。函数“SetSystemTime / GetSystemTime”用于设置或读取格林威治时间。
       函数“SetLocalTime / GetLocalTime”用于设置或读取本地计算机时间。
      两种时间会因地理的时区不同而改变。两个函数使用方法相 同。
      3.2 WinCC 项目激活时避免脚本初次执行及延迟执行脚本
        全局脚本在项目激活时,是要执行一次的,在有些情况下,需要避免脚本执行,就采用在脚本中去判断。比如 可以创建 WinCC 内部布尔型变量 flag,脚本如下:
      #include "apdefap.h"
    intgscAction( void )
    {
          #pragma option(mbcs)
     
          if ( GetTagBit("flag")==1) 
                  SetTagWord("NewTag",1);//根据自己的需求编写对应代码.
         else
                  SetTagBit("flag",1);    //Return-Type: BOOL
    return0;
    }
        除了避免项目运行激活时触发脚本执行,我们 还可以通过 Sleep() 延迟脚步功能执行,比如开机后五分钟开始执行脚本具体功能,代码如下:
      #include "apdefap.h"
    intgscAction( void )
    {
            #pragma option(mbcs)

    西门子S7-200PLC的RS485通信口易损坏的原因分析和解决办法

    一、 S7-200PLC内部RS485接口电路图:电路图见附件
    图中R1、R2是阻值为10欧的普通电阻,其作用是防止RS485信号D+和D-短路时产生过电流烧坏芯片,Z1、Z2是钳制电压为6V,最大电流为10A的齐纳二极管,24V电源和5V电源共地未经隔离,当D+或D-线上有共模干扰电压灌入时,由桥式整流电路和Z1、Z2可将共模电压钳制在±6.7V,从而保护RS485芯片SN75176(RS485芯片的允许共模输入电压范围为:-7V~+12V)。该保护电路能承受共模干扰电压功率为60W,保护电路和芯片内部没有防静电措施。
    西门子S7-200PLC内部RS485接口电路图


    二、常发生的故障现象分析:
    当PLC的RS485口经非隔离的PC/PPI电缆与电脑连接、PLC与PLC之间连接或PLC与变频器触摸屏等通信时时有通信口损坏现象发生,较常见的损坏情况如下:
    ●R1或R2被烧断,Z1、Z1和SN75176完好。这是由于有较大的瞬态干扰电流经R1或R2、桥式整流、Z1或Z1到地,Z1、Z2能承受最大10A电流的冲击,而该电流在R1或R2上产生的瞬态功率为:102×10=1000W,当然会将其烧断。
    ●SN75176损坏,R1、R2和Z1、Z2完好。这主要可能是受到静电冲击或瞬态过电压速度快于Z1、Z2的动作速度造成的,静电无处不在,仅人体模式也会产生±15kV的静电。
    ●Z1或Z2、SN75176损坏,R1和R2完好。这可能是受到高电压低电流的瞬态干扰电压将Z1或Z2和SN75176击穿,由于电流较小和发生时间较短因而R1、R2不至于发热烧断。
    由以上分析得知PLC接口损坏的主要原因是由于瞬态过电压和静电造成,产生瞬态过电压和静电的原因很多也较复杂,如由于PLC内部24V电源和5V电源共地,24V电源的输出端子L+、M为其它设备混合供电可能导致地电位变化,从而造成共模电压超出允许范围。所以EIA-485标准要求将各个RS485接口的信号地用一条低阻值导线连接在一起以保证各节点的地电位相等,消除地线环流!
    当带电插拔未隔离的连接电缆时,由于两端电位不相等电路中又存在诸多电感、电容之类的器件,插拔瞬间必然产生瞬态过电压或过电流。
    连接在RS485总线上的其它设备产生的瞬态过电压或过电流同样会流入到PLC,总线上连接的设备站点数越多,产生瞬态过电压的因素也越多。
    当通信线路较长或有室外架空线时,雷电必然会在线路上造成过电压,其能量往往是巨大的,常有用户沮丧地说:“联网的几十台PLC全部遭打坏了!”。
    三、 解决办法:
    1、从PLC内部考虑:
    ●采用隔离的DC/DC将24V电源和5V电源隔离,分析了三菱、欧姆龙、施耐德PLC以及西门子的PROFIBUS接口均是如此。
    ●选用带静电保护、过热保护、输入失效保护等保护措施完善的高挡次RS485芯片,如:SN65HVD1176D、MAX3468ESA等,这些芯片价格一般在十几元至几十元,而SN75176的价格仅为1.5元。
    ●采用响应速度更快、承受瞬态功率更大的新型保护器件TVS或BL浪涌吸收器,如P6KE6.8CA的钳制电压为6.8V,承受瞬态功率为500W,BL器件则可抗击4000A以上大电流冲击。
    ●R1和R2采用正温度系数的自恢复保险PTC,如JK60-010,正常情况下的电阻值为5欧,并不影响正常通信,当受到浪涌冲击时,大电流流过PTC和保护器件TVS(或BL),PTC的电阻值将骤然增大,使浪涌电流迅速减小。
    2、从PLC外部考虑:
    ● 使用隔离的PC/PPI电缆,尽量不用廉价的非隔离电缆(特别是在工业现场)。西门子公司早期出产的PC/PPI电缆(6ES7 901-3BF00-0XA0)是不隔离的,现在也改成隔离的电缆了!
    ● PLC的RS485口联网时采用隔离的总线连接器.
    ● 与PLC联网的第三方设备,如变频器、触摸屏等的RS485口均使用RS485隔离器BH-485G进行隔离,这样各RS485节点之间就无“电”的联系,也无地线环流产生,即使某个节点损坏也不会连带其它节点损坏。
    ● RS485通信线采用PROFIBUS总线专用屏蔽电缆,保证屏蔽层接到每台设备的外壳并最后接大地。
    ● 对于有架空线的系统,总线上最好设置专门的防雷击设施。 

    找到了解决S7-200通讯口损坏的办法了

    在我们单位众多的S7-200PLC中,不时有通讯口损坏,致使不能连接PC或不能进行通讯,在对PLC解体时发现,在PLC通讯口出有一芯片--75176,这就是通讯接口芯片,在芯片周围有5个FB,标识FB1~FB5,这其实就是5个保险,在通讯连不上时,一般就是这5个保险中的某个烧毁了,可用同等型号的保险代替,也可用导线直接短路。一般就能解决问题。不过更换时要注意,由于元件时贴片的,十分小,空间也小,所以焊接时注意不要短路。

    西门子PLC网络读写指令向导使用指南

    PPI协议是专门为S7-200开发的通信协议。S7-200 CPU的通信口(Port 0、Port 1)均支持PPI通信协议。S7-200 CPU的PPI网络通信是建立在RS-485网络的硬件基础上,因此其连接属性和需要的网络硬件设备与其他RS-485网络一致。

    1  网络读写(NETR/NETW)指令介绍

    网络读写指令一般用于S7-200 CPU之间的PPI网络通信。PPI通信前要保证PPI网络上的所有站点都应当有各自不同的网络地址,否则通信不会正常进行。另外,网络读写指令进行编程和应用时要注意以下几点:
    1)    在程序中可以使用任意条网络读写指令,但是在同一时刻,最多只能有8条网络读写指令被激活;
    2)    每条网络读写指令可以从远程站点读取/写入最多16个字节的信息;
    3)    使用NETR/NETW指令向导可以编辑最多24条网络读写指令,其核心是使用顺序控制指令,这样在任一时刻只有一条NETR/NETW指令有效;
    4)    每个CPU的端口只能配置一个网络读写指令向导。

    2  网络读写指令向导组态

    2.1 硬件连接

           下面通过一个实例(两台S7-200 PLC之间的通信)来介绍如何使用网络读写指令向导。首先,两个S7-200之间的硬件连接需要一根标准DP电缆加两个DP总线插头。两台S7-200的RS485通信端口连接方式,可参考以下图片中的连接方式(如果PLC有两个通信端口,则任意端口都可进行配置,本例中两个PLC均以Port 0口做PPI通信使用),如图1所示。

     

    图1   两台PLC的网络连接

    2.2 NETR/NETW向导组态过程

    2.2.1设定通信站地址

           首先,用PC/PPI编程电缆将两台PLC的网络站地址分别设置为2和3,波特率都为9.6Kbps。这时,将编程电缆连接到任一个CPU带可编程插口的DP插头上,查找两台PLC的站地址,如图2所示。

      
    图2   设定两台CPU的网络地址

           在本例中,选定通信地址为3的PLC为网络主站,并对其进行向导配置。选定要做为通信主站的CPU地址,点击确认后即可进入该CPU的编程界面。另外,网络读写指令向导会自动将CPU设置成主站模式,不必另行编程设置,只需为主站编写通信程序,从站直接使用通信缓冲区中的数据,或将数据整理到通信区即可。

    2.2.2 向导配置步骤

           进入到编程画面后,点击工具菜单栏,找到指令向导选项,准备进入网络读/写功能的向导配置模式,如图3所示。 

     
    图3 进入指令向导编程界面

    打开指令向导界面,选择NETR/NETW指令功能,如图4所示。 

    HMI
    6AV6 640-0BA11-0AX0 OP 73 micro s7-200系列用
    6AV6 640-0CA11-0AX0 TP177 micro 触摸式 s7-200系列用
    6AV6 640-0DA11-0AX0 K-TP 178 micro s7-200系列用
    6AV6 641-0AA11-0AX0 OP 73  单色  3英寸  
    6AV6 641-0BA11-0AX0 OP 77A  单色 4.5英寸  
    6AV6 641-0CA01-0AX0 OP 77B  单色 4.5英寸  
    6AV6 642-0AA11-0AX0 TP 177A  单色 5.7英寸  
    6AV6 642-0BC01-1AX1 TP 177B DP 单色 5.7英寸
    6AV6 642-0BA01-1AX0 TP 177B PN/DP 彩色 5.7英寸
    6AV6 642-0DC01-1AX0 OP 177B DP 单色 5.7英寸
    6AV6 642-0DA01-1AX0 OP 177B PN/DP 彩色 5.7英寸
    6AV6 643-0BA01-1AX0 OP 277-6操作员面板,5.7寸彩色中文显示
    6AV6 643-0AA01-1AX0 TP277-6 触摸式面板,5.7寸彩色中文显示
    6AV6 643-0CB01-1AX1 MP277-8 触摸式面板,8寸64K色中文
    6AV6 643-0DB01-1AX1 MP277-8 按键式面板,8寸64K色中文显示
    6AV6 643-0CD01-1AX1 MP277-10 触摸式面板,10寸64K色中文
    6AV6 643-0DD01-1AX1 MP277-10 按键式面板,10寸64K色中文显示
    6AV6671-1CB00-0AX0  MMC 存储卡 128 MB 用于 OP77B, OP/TP 177B, MOBILE PANEL 177 
    6AV6671-1CB00-0AX1  MMC 存储卡 64 MB 用于 OP77B, OP/TP 177B, MOBILE PANEL 177 
    6AV6644-0AA01-2AX0 SIMATIC  MP 377 12" TOUCH      
    6AV6644-0AB01-2AX0 SIMATIC  MP 377 15" TOUCH      
    6AV6644-0AC01-2AX0 SIMATIC  MP 377 19" TOUCH
    6AV6644-0BA01-2AX0 SIMATIC  MP 377 12" KEY
    6AV6647-0AA11-3AX0  SIMATIC KTP400 Basic mono PN 3.8" mono STN 显示屏,以太网接口
    6AV6647-0AB11-3AX0  SIMATIC KTP600 Basic mono PN 5.7" mono STN 显示屏,以太网接口,
    6AV6647-0AC11-3AX0  SIMATIC KTP600 Basic color DP 5,7" TFT 显示屏,256 色 MPI/PROFIBUS DP 接口
    6AV6647-0AD11-3AX0  SIMATIC KTP600 Basic color PN 5,7" TFT 显示屏,256 色以太网接口
    6AV6647-0AE11-3AX0  SIMATIC KTP1000 基本色 DP 10.4" TFT 显示器,256 色 MPI/PROFIBUS DP 接口
    6AV6647-0AF11-3AX0  SIMATIC KTP1000 基本色 PN 10,4" TFT 显示器,256 色,以太网接口,
    6AV6647-0AG11-3AX0  SIMATIC TP1500 基本色 PN 15.0" TFT 显示器,256 色,以太网接口,
    6AV6647-0AH11-3AX0  SIMATIC HMI kp300基本单PN,基本面板,按键操作,3寸”
    6AV2124-0GC01-0AX0  SIMATIC HMI TP700 7.0 英寸宽屏 TFT 显示屏,分辨率 800 x 480,1600 万色 
    6AV2124-0JC01-0AX0  SIMATIC HMI TP900,?9.0 英寸宽屏 TFT 显示屏,分辨率 800 x 480,1599 万色
    6AV2124-0MC01-0AX0  SIMATIC HMI TP1200 ?12.1 英寸宽屏 TFT 显示屏,分辨率 1280 x 800,1600 万色 
    6AV2124-0QC02-0AX0  SIMATIC HMI TP1500 ?15.4 英寸宽屏 TFT 显示屏,分辨率 1280 x 800,1600 万色
    ?2 个PROFINET 接口(2 个端口带有集成开关 + 支持千兆位的附加接口)和 1 个 PROFIBUS 接口
    6AV2124-0UC02-0AX0  SIMATIC HMI TP1900 ?18.5 英寸宽屏 TFT 显示屏,分辨率 1366 x 768,1600 万色 
    6AV2124-0XC02-0AX0  SIMATIC HMI TP2200,?21.5 英寸宽屏 TFT 显示屏,分辨率 1920 x 1080,1600 万色 
    6AV2124-1DC01-0AX0  SIMATIC HMI KP400 ?4.3 英寸宽屏 TFT 显示屏,分辨率 480 x 272,1600 万色 
    6AV2124-1GC01-0AX0 SIMATIC HMI KP700 ?7.0 英寸宽屏 TFT 显示屏,分辨率 800 x 480,1600 万色 
    6AV2124-1JC01-0AX0  SIMATIC HMI KP900 ?9.0 英寸宽屏 TFT 显示屏,分辨率 800 x 480,1600 万色 
    6AV2124-1MC01-0AX0  SIMATIC HMI KP1200 ,?12.1 英寸宽屏 TFT 显示屏,分辨率 1280 x 800,1600 万色 
    6AV2124-1QC02-0AX0  SIMATIC HMI KP1500 ?15.4 英寸宽屏 TFT 显示屏,分辨率 1280 x 800,1600 万色 
    6AV2124-2DC01-0AX0  SIMATIC HMI KTP400 ?4.3 英寸宽屏 TFT 显示屏,分辨率 480 x 272,1600 万色 
    6AV6645-0AA01-0AX0  SIMATIC 移动式面板177 DP,带集成启动按钮,使用WINCC FLEXIBLE紧凑型2005或以上进行组态 
    6AV6645-0AB01-0AX0  SIMATIC 移动式面板177 DP,带集成启动按钮和急停按钮,使用WINCC FLEXIBLE紧凑型2005或以上进行组态
    6AV6645-0AC01-0AX0  SIMATIC 移动式面板177 DP,带集成启动按钮和急停按钮、手轮、钥匙开关和亮光按钮, 
    6AV6645-0BA01-0AX0  SIMATIC 移动式面板177 PN,带集成启动按钮,使用WINCC FLEXIBLE紧凑型2005或以上进行组态 
    6AV6645-0BB01-0AX0  SIMATIC 移动式面板177 PN,带集成启动按钮和急停按钮,使用WINCC FLEXIBLE紧凑型2005或以上进行组态 
    6AV6645-0BC01-0AX0  SIMATIC 移动式面板177 PN,带集成启动按钮和急停按钮、手轮、钥匙开关和亮光按钮, 
    6AV6645-0BE02-0AX0  SIMATIC 移动式面板 277 10" W,集成使能按钮、停止按钮和触控按钮,
    6AV6645-0CA01-0AX0  SIMATIC 移动式面板277,带集成启动按钮,
    6AV6645-0CB01-0AX0  SIMATIC 移动式面板277,带集成启动按钮和急停按钮,
    6AV6645-0CC01-0AX0  SIMATIC 移动式面板277,带集成启动按钮和急停按钮、手轮、钥匙开关和两个亮光按钮 

    西门子STL间接寻址常问问题集

    1.1如何获得指针或者间接寻址有关的信息?
    指针的类型包括16位指针、32位指针、Pointer(6Byte)和Any(10Byte)。16位指针用于定时器、计数器、程序块的寻址;32位指针用于I/Q/M/L/数据块等存储器中位、字节、字以及双字的寻址,其中第0~2位表示位地址(0~7)、第3~18位为字节地址,其余位未定义;Pointer和Any一般应用在复杂数据类型(比如Date_and_Time /Array/String等)在FB、FC之间的传递。而Any可以看做是对Pointer的延伸,因为由10Byte组成的Any中Byte4~Byte9就是一个Pointer。
    了解指针的格式十分重要,为正确使用指针,应阅读如下内容:
    1、 "SIMATIC Programming with STEP 7 V5.5" 05/2010 第27.3.4章 参数类型
    2、文档:1008用于S7-300 和S7-400 的语句表(STL)编程
    3、文档:F0215,S7-300和S7-400寻址 1.2为什么语句 LAR1 P##PointerInput 在一个函数(FC)中是无效的,然而,同样的语句在一个功能块(FB)中是有效的?
    在FC被调用时,复杂数据类型例如指针是被复制到调用者的临时变量区中,在FC内部对此V区地址直接取址放入到地址寄存器AR1或AR2是不被编译器规则接受的(导致MC7寄存器信息过长),也就是说在FC内部通过P#进行地址寄存器取址仅能支持Temp临时变量。因此如果需要在FC中操作指针等复杂输入输出变量地址需要使用累加器进行中转。
    考虑到程序的一致性、遵守编译器规则和STL手册中LAR1指令说明,建议用户使用如下指令操作:
    L P##PointerInput
    LAR1 1.3 STEP 7 中哪些操作会覆盖DB/DI寄存器或者地址寄存器AR1/AR2的内容?
    下面说明了可能引起DB/DI寄存器或者地址寄存器AR1/AR2内容改变的一些操作:


    • DB寄存器和AR1受到影响的操作
      1. 使用完整的DB路径(如L DB20.Val)或者调用FC/FB时使用DB块完整地址作为其参数,则DB寄存器内容被覆盖。
      例如在OB1中调用FC1后,DB寄存器变成20。
      OPN DB1
      Call FC1
      Input(bit):DB20.DBX0.2
      因此在编程的时候,OPN 指令打开数据块,通过DBX x.y的方式访问其中内容, 但是如果在打开数据块后DB寄存器的内容被修改了,则DBX x.y的方式访问变量则 会访问到错误的地址。可以通过使用符号寻址的方式或者使用完整路径编程避免,当 然重新使用 OPN指令也是可以的。
      2. 调用FC时使用string, array, structure ,UDT作为其形参或者调用FB时使用string, array, structure 或者UDT作为其in out形参,在FC/FB程序中访问这些地址则AR1寄存器内容被覆盖,因此当使用AR1进行间接寻址时需要注意AR1内容的正确性。
    • AR2地址寄存器和DI寄存器在FB中作为参数和静态变量的基址寻址使用。AR2和DI如果被修改,会影响FB的参数访问,如果希望在FB中使用DI寄存器或者地址寄存器AR2,必须预先保存它们中的内容,并在使用后恢复它们,例如:
      TAR2 #AR2_SAVE; //AR2寄存器状态保存到#AR2_SAVE
      L DINO;
      T #DB2_SAVE; //DI寄存器状态保存到#DB2_SAVE
    User Program
    LAR2 #AR2_SAVE; //AR2寄存器恢复到使用前状态
    OPN DI [#DB2_SAVE]; //DI寄存器恢复到使用前状态
    1.4 如何得到多重背景FB中的变量在背景DB里的绝对偏移量呢?
    可以用下面的方法处理:
    TAR2 (得到多重背景FB在背景DB里的偏移地址)
    AD DW#16#00FFFFFF (屏蔽掉存储区ID,可参考32位指针格式)
    L P##Variable (得到变量在多重背景FB里的地址)
    +D (多重背景FB的偏移地址与变量在多重背景FB里地址相加,即得到实际绝对偏移量)
    LAR1
    上述语句就是就得到了变量在背景DB中的绝对偏移量,从而供后续程序处理。 1.5如何在程序中使用ANY 型指针? 简要说明如下:
    L P##Input //指向存储地址指针Input首地址
    //这个参数是一个Any类型,P##Input指向参数Input的值所在地址,这就是指针的指针
    LAR1 //装载到地址寄存器AR1中。
    L W [AR1,P#4.0] //打开DB块
    // 由Any类型结构知道Any类型的Byte4、Byte5存放的数据块号
    T #BLOCK_NO
    OPN DB [#BLOCK_NO] //如果是DB块,打开指定的DB块。
    L W [AR1,P#2.0] //判断ANY指针中数据长度
    // Any类型的Byte2、Byte3是重复系数,如P#DB1.DBX0.0 Byte 8后面的Byte 8
    _001:T #DATA_LEN //通常此处做loop循环!!
    L D [AR1,P#6.0] //找出需要计算数据区的开始地址
    // Any类型Byte6~Byte9是32位区域地址
    理解Pointer、Any的类型的数据结构,对于正确使用指针有很大帮助。
    为正确使用指针,应仔细阅读如下内容:
    "SIMATIC Programming with STEP 7 V5.5" 05/2010 第27.3.4章 参数类型 如下的程序实现了SFC20的部分功能,可以作为Any使用的参考。
    FUNCTION FC 1 : VOID
    TITLE =
    VERSION : 0.1
    VAR_INPUT
    SRCBLK : ANY ;
    END_VAR
    VAR_OUTPUT
    RETVAL : INT ;
    DSTBLK : ANY ;
    END_VAR
    VAR_TEMP
    LOOP : INT ;
    BLOCK_NO_DB : WORD ;
    BLOCK_NO_DI : WORD ;
    SRC_ADD : DWORD ;
    DST_ADD : DWORD ;
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    L P##SRCBLK; //读取输入any的首地址
    LAR1 ; //装载到ar1
    L P##DSTBLK; //读取输出any的首地址
    LAR2 ; //装载到ar2
    L W [AR1,P#4.0]; //打开DB块
    T #BLOCK_NO_DB;
    L W [AR2,P#4.0]; //打开DI块
    T #BLOCK_NO_DI;
    OPN DB [#BLOCK_NO_DB]; //打开DB块
    OPN DI [#BLOCK_NO_DI]; //打开DI块
    L D [AR1,P#6.0];
    T #SRC_ADD; //读取地址
    L D [AR2,P#6.0];
    T #DST_ADD; //读取地址 L W [AR1,P#2.0]; //读取循环次数
    _001: T #LOOP;
    L DBB [#SRC_ADD];
    T DIB [#DST_ADD]; //赋值
    //地址偏移1个字节
    L P#1.0;
    L #SRC_ADD;
    +D ;
    T #SRC_ADD;
    L P#1.0;
    L #DST_ADD;
    +D ;
    T #DST_ADD;
    L #LOOP; //循环
    LOOP _001;
    END_FUNCTION 1.6 当FC 或FB的输入参数类型为:BLOCK_DB, TIMER或者 COUNTER,如何确定其编号?
    例1 :FB 块
    FB1 变量声明中定义了“ Timer” 类型的变量“ Time_1” ,在 FB2 中调用 FB1,将定时器“T5”传递给变量“ Time_1”。如图 01 所示程序代码中数值 5 表示“T5”。


    图 01 FB中确定定时器编号 在使用多重实例时,需要在图 01 所示程序中增加以下代码:
    TAR2 //多重实例偏移地址
    LAR1 P##Time_1
    +AR1 //多重实例偏移地址与当前地址相加
    L W[AR1,P#0.0]
    T MW0
    例 2 FC
    FC1 变量声明中定义了“ Timer” 类型的变量“ Time_1” ,在 FC2 中调用 FC1,将定时器“T8”传递给变量“ Time_1”。如图 02 所示程序代码中数值 8 表示“T8”。


来源:上海赞国
免责声明:地方电气网转载作品均注明出处,本网未注明出处和转载的,是出于传递更多信息之目的,并不意味 着赞同其观点或证实其内容的真实性。如转载作品侵犯作者署名权,或有其他诸如版权、肖像权、知识产权等方面的伤害,并非本网故意为之,在接到相关权利人通知后将立即加以更正。联系电话:0571-87774297。
0571-87774297