浔之漫智控技术(上海)有限公司
西门子PLC模块 , CPU模块 , DP通讯电缆 , 6GK交换机
西门子扩展模块6ES7231-7PC22-0XA0
发布时间:2023-10-26

    西门子S7-300/400 plc的存储器结构可以分为基本存储区域与程序处理区两大部分。
    (1)基本存储区域
    S7-300/400 PLC的基本存储区域又可以分为装载存储区、系统存储区、工作存储区3部分,具体如下。
    ①装载存储区(Load Memory):相当于S7-200的程序存储区,用于PLC用户程序逻辑块、数据块的存储。
    ②系统存储区(System Memory):相当于S7-200的数据存储区,用于存储PLC运算、处理的中间结果。如:输入/输出映像,标志、变量的状态存储,计数器、定时器的中间值,模拟量输入/输出状态等,使用PLC内部RAM。
    ③工作存储区(Work Memory):用于存储当前处理的可执行程序块、程序块所生成的局部变量L等。3个存储器区域的作用以及相互间的关系如图所示。
    (2)程序处理区域
    S7-300/400 PLC的程序处理区域又可以分为累加器、地址寄存器、数据块地址寄存器、状态寄存器4部分,具体如下。
    ①累加器:S7-300/400共有2个32位累加器ACCU1、ACCU2,用来进行读入,传送、运算、移位等操作。
    ②地址寄存器:S7-300/400共有2个32位地址寄存器AR1、AR2,用于存放寄存器间接寻址时的地址指针。
    ③数据块地址寄存器:S7-300/400共有2个32位数据块地址寄存器DB、DI,用于存放程序中被打开的数据块地址。程序执行过程中允许同时被打开的数据块*大为2个,其中一个为共享数据块(DB),在程序中可以任意使用;另一个为瞬时数据块(DI),它是与功能块FB配套使用的数据块,在调用FB时同时打开。
S7-300/400存储器区域的作用及相互关系
图:S7-300/400存储器区域的作用及相互关系
    ④状态寄存器:S7-300/400共有1个16位状态寄存器STW,状态寄存器用于存放程序的处理结果,如:逻辑运算结果RLO、溢出标志OV、溢出记忆OS、条件码CCO与CC1、二进制值BR等,以显示指令的执行结果。

已调试成功,希望能对有类似情况的朋友有帮助。
   今天同事打电话说现场6台宇电AI仪表,1台东辉8路巡检仪,3台富士FRENIC-VP变频器,2台日本RKC仪表,1台创盛流量计都要挂到WINCC里(之前说是厂方自己弄的),因为厂方临时要求加的,邮寄CP340挂到S7300就算了,也没几个通信设备,都是RS485,一条通讯线挂一起,能省就省吧,同事随身带的有RS485转232模块。
   平常项目都是自己写的软件,二年前就用过一次WINCC6,外挂其它通讯设备也没试过,在网上搜了一圈,多是讲opc什么的,不了解,觉得对我来说不太合适。还有讲用MSCOMM控件的。MSCOMM控件就不提了,已废弃多年不用了,不可能再回到老路上。于是决定移植上位机的代码,用WIN32 API 来做成OCX,WINCC里来调用,这样并非像网上说的要支持MODBUS协议或找OPC什么,只要通讯设备有通讯协议,带通讯接口即可。我的方法看起来也许比较麻烦,但方便维护,去现场调试的人不需对通讯怎么懂,会设置通讯设备的地址参数就行了,其它都用默认参数,再说增加个新的通讯设备协议,也就一小会儿事。
1.先编个基类,定义接口,方法,属性,例如通讯COM口,波特率、数据位、停止位、校验方式等等生成dll链接库。
2.从基类派生各个通讯设备类,如仪表,变频器,流量计,plc等等,通讯设备类负责将要读或要写的数据打包给串口类,并接收来自串口类的回送数据进行处理,生成dll链接库,这个库*大,包含了五十多种设备的通讯,以后新加通讯设备只需拷贝一个,稍加修改即可。
3.再编个通讯串口类,调用WIN32通信API函数,负责将通讯设备类打包过来的发送数据发送出去,再将接收到数据返回给通讯类自身处理,生成dll动态链接库。
4.再编个消息类,负责将通讯的发送字节,接收字节,当前通讯设备的通讯设置参数,通信成功或失败等信息作为事件触发,生成dll动态链接库.
5.后面的就简单了,编个OCX控件直接引用上面的DLL库编几个小调用函数,再封装几个属性和消息事件触发,编译一下做个OCX安装程序。
6.发给同事OCX安装包,同事安装后直接注册下OCX即可用,只需在WINCC里初始化下这个OCX挂的各个设备名称,通讯地址,端口,波特率,数据位,停止位。然后再在循环处理过程里编个通用的轮循过程,要读的设备号,要读的参数或要写的参数及要写的数据。读写成功失败或者收发的字节通过OCX的事件触发来处理。
7.如果现场新加的通讯设备协议在这个OCX中,WINCC只需要改一下初始化过程,挂靠的OCX通讯设备名称,通讯参数即可,其它如轮循过程,变量处理根本不需要改动。
       如果WINCC只挂少量设备,也可以采用MSCOMM控件处理,毕竟MSCOMM简单,建议还是不要在WINCC里直接用MSCOMM控件,代码很乱,不方便移植。还是自己编个OCX,在OCX里面用MSCOMM控件,再封装几个方法属性出来给WINCC调用,也方便客户使用。

   毕竟WINCC我很少用它,但它确实很强大^_^,也许是我不熟的原因,觉得它通信慢。问下大家,读单字,双字大概算下来有合计800个16位字的通讯,MPI方式.下午顺便发了个测试代码给同事,同事说WINCC一次大概只能读100多个字,也就是200多个字节,再多了就失败,而且每次耗时大概1~2秒.那800个字不得调8次?感觉这样不行。我用的GetTagRaw函数.但是我记得如果采用PRODAVE方式,一次就可以读回来了,耗时感觉不到1秒,正考虑是不是把S7300/200 PLC通讯全移到OCX处理算了,不知有没这个必要。


展开全文
优质商家推荐 拨打电话