技术论坛

 更新对S7-200Smart的认识3-寻址方式

返回主题列表
作者 主题
holdkcsxyz
至圣

经验值:12949
发帖数:1803
精华帖:22
楼主    2020-10-12 11:16:46
主题:更新对S7-200Smart的认识3-寻址方式 精华帖  精编帖 

更新对S7-200Smart的认识3-寻址方式

针对以下案例做了一个S7-200Smart间接寻址FC贴在下面。关键的计算是对矩阵的行参数取余/取整来计算坐标;得到的列参数对2取余/取整来判断奇偶列,进一步算出对称行参数,从而进行S型轨迹寻址操作。由于计算方法有很多种(比如用户点一次计算一次数据等等),因此例程方法应该不是内存占用以及运行时间最优的。

S7-200Smart在实际控制器上测试运行过/S7-1200的程序模板是Zane版主在西门子官方论文集上开源的程序模板

FC块需要脉冲调用在S7-200Smart实际测试过,在S7-1200中仿真过。局部变量未仔细考虑中断嵌套失效的可能性,仅供参考。

Smart的间接寻址类C形式也是很方便,很强大。参数类型为地址传递非值传递时,输入参数传入地址,可改变输入地址里面的内容;1200的数据结构比200丰富。

注:

矩阵列数:用户可设默认6

矩阵行数:用户可设默认8

矩阵地址:用户设置=1则加工;=0则不加工

坐标列差:用户可设工作区X间距X=64

坐标行差:用户可设工作区Y间距Y=36

坐标地址:工作区结构体数组变量:浮点型X坐标;浮点型Y坐标; 整数型被选中点的序号变量。结构体数组元素个数不定在1-48之间

原首行差:用户可设原点到首个工作点的行差距Y=36

原首列差:用户可设原点到首个工作点的列差距X=64

显示地址:控制HMI动态显示地址

针对坐标值的数据可以变位置变速度传递给执行电机,可以根据缓存的坐标数据走简单的"伪插补"。

开始扫描计算一次HMI选中的S型点VB100-VB147,算出坐标地址点1行坐标字mm/列坐标字mm选中第一个点的X浮点坐标存在VD2200中,第一个点的Y浮点坐标值存在VD2204中,第一个点待加工标志序号存在VW2208;显示指针字节存放在VB7000-VB7047其中的一个地址中,以此类推。VB7000==0灰色不加工(初次扫描改变);VB7000==1绿色待加工(初次扫描改变);VB7000==2黄色已加工(后续自动运行改变);VB7000==3紫色加工中(后续自动运行改变);


1:案列描述-VB100-VB147是用户点击屏幕选中是否加工,点中==1待加工;==0未点中不加工,工作执行电机的运动轨迹是S型工作。



2:S7-200Smart-Demo



以下是每个扫描周期都调用测试运行正常(FC复用正常)


3:S7-1200-Demo




仿真两种选择状态




例程下载:


S7-1200.rar


S7-200Smart.rar


Zane
至圣

经验值:75775
发帖数:19249
精华帖:376
1楼    2020-10-13 21:54:44
精编帖  主题:回复:更新对S7-200Smart的认识3-寻址方式

赞一个!


@ holdkcsxyz 您的帖子我编辑了一下,帮您把两个例程上传了。


再给个建议,要设计一个路径,如果起始点是X0Y0,最后一个灌胶点是X0Y1或X1Y0才是效率最高的,这样回X0Y0的距离是最短的,并且动作间距是一致的,程序还能再简化。


当然,还有一种方案是从哪儿结束直接从哪儿开始。

Zane 注册自动化系统工程师 Always save before download
holdkcsxyz
至圣

经验值:12949
发帖数:1803
精华帖:22
2楼    2020-10-14 09:26:16
精编帖  主题:回复:更新对S7-200Smart的认识3-寻址方式

       感谢Zane版点赞!是的有简化的空间,包括输入数据优化/路径较短/实时刷新动态选择是否加工等考虑。第一次看到案例要求两轴单动走直角坐标,而且大部分都是全选加工,因此没多想,有时间再优化下。

holdkcsxyz
至圣

经验值:12949
发帖数:1803
精华帖:22
7楼    2020-10-28 12:58:02
精华帖  精编帖  主题:回复:更新对S7-200Smart的认识3-寻址方式

    在Zane版的博图环境下通过用户程序实现硬件IO自由组态的基本方法最后提出用FC加全局DB替代FB,利用全局数据比较容易实现数组化的特点,同样在原有程序基础上实现硬件IO地址用户程序可组态,也许这样编程方法会更加的灵活简单。

   最近有时间细读学习后觉得有道理,因此简单的贴个Smart编程环境下的阀门块。可通过增加循环数(阀门数量),并为新增阀门的私有全局变量区分配接近开关,启停,线圈,超时时间设置来扩展相同逻辑的IO控制。

   因此结帖贴一个间接寻址的帖子,简易实现上述n个阀门的启保停,可以看看套路,离实用可能还要修改,而且运行时间也待优化。

   实际仿真测试没问题,包含子程序中脉冲沿,计时器,局部变量的处理仅供参考;类似的间接寻址的数据传输方式Winter938等很多工程师也有很多帖子。

n个相同类型阀门的启保停控制块

n个阀门的公共数据区类型:

时钟源(双字):所有阀门公用一个时钟源ms

循环数(单字):FOR循环次数等价于要控制的阀门量

每个阀门的私有数据区类型:

阀门开(布尔):开脉冲(读写)

阀门关(布尔):关脉冲(读写)

阀开限(布尔):开限位(只读)

阀关限(布尔):关限位(只读)

阀线圈(布尔):阀线圈(读写)

开到位(布尔):开到位(开限位正确)

关到位(布尔):关到位(关限位正确)

阀状态(字节):阀状态(10种状态有8种是非常状态;2种常态)

阀超时(双字):每个阀门的超时设置时间ms

阀动始(双字):每个阀门开或关动作时记录一次动作开始时间戳ms

阀动计(双字):每个阀门开或关动作过程结束后记录动作时间差值ms

OB_1


Valve

仿真公共数据区时钟源和每个阀门超时设置

每个阀门的私有数据区类型

程序

n个相同类型阀门的控制块.PDF

程序

n个相同类型阀门的控制块+仿真块终定版 .PDF

以上改.Smart后缀名打开

文档

Valve_FC_文档.doc

       增加磁性接近开关仿真子程序---子程序严格遵循局部变量先赋值后使用,并将产生变化的局部临时变量反馈拷贝回写到对应的私有全局变量区。将阀状态字节优化成与或逻辑运算,区分阀门状态。

       阀门块Valve的终定版优化了:全局传局部;局部返全局的时序,仅供参考。

       结语:C中为解决子程序紧凑而且多次调用而不会破坏堆栈的结构1:利用函数指针(这方法在外挂子程序中用的最多,编程者希望外挂程序多次调用保证人物满血,又不希望加的程序影响游戏的其它的进程,否则游戏没得玩)或传递给子函数参数类型为各种指针类型(如数组指针,结构体指针)。 2:对于堆栈结构优化如静态局部变量(仅初始化一次)优化成堆,局部变量为栈。3:采用多线程优化局部变量释放内存的时刻,生存周期以及作用范围。初识200或SMART的的工程师一般习惯全局变量编程(不像300等直接要求要了解更多的数据结构),全局变量因为很直观,所以觉得容易入门,但复用性相对差点。深入了解200后会觉得200也很灵活无太多的束缚很自由,对向子函数传递指针等处理技巧应该会逐步加强.《子程序多处调用,但又不得同时调用的问题。


holdkcsxyz
至圣

经验值:12949
发帖数:1803
精华帖:22
8楼    2020-12-02 16:51:16
精编帖  主题:回复:更新对S7-200Smart的认识3-寻址方式

矩阵乘法对最短路径计算/滤波/图形变换等应用有关而且与间接寻址有关因此贴在后面。

C==AXB(矩阵三==矩阵一乘矩阵二)

A/B/C三个矩阵存成一维数组的元素放置规则(很重要):

1:A矩阵的元素按照先行后列"之"子型排成一维数组存放在A的浮点型地址里;

2:B矩阵的元素按照先列后行"之"子型排成一维数组存放在B的浮点型地址里;

3:C矩阵的元素按照先行后列"之"子型排成一维数组存放在C的浮点型地址里;

4:工程数学的行列式任意先行后列/先列后行的运算等价即行和列具有同等地位;

5:矩阵的序号变量可有可无:因为只要知道矩阵的行数/列数,以及矩阵首地址

 及排列方式(先行后列或者先列后行的"之"子型排列)就可以运算知道每个元素

 的行数列数运算规则如下

6:

  1:对于行优先之字形排列的矩阵:行参数==元素的序号变量对行参数取整后加一;列参数==该元素的序号变量对行参数取余后加一;

  2:对于列优先之字形排列的矩阵:列参数==元素的序号变量对列参数取整后加一;行参数==该元素的序号变量对列参数取余后加一;








Matrix_Mul.Pdf

.PDF改.Smart打开。

最终版在网络13修改添加了一个单整数转双整数的指令.

程序用以前最原始固件的奖品CR60测试OK,未考虑空矩阵以及参数超范围等容错机制,仅供参考。

//////////////////////////////////////////////////////////////////////////////////////////////////////

以下函数实现了2个功能:行排列变列排列;转置

1:L-R:矩阵的一维数组由行优先之字形排列转成列优先之字形排列,且元素的序号绑定不改变。

      因此上个例程的B矩阵如果原先是行优先之字形排列可以通过这个函数转换成列优先之字形排列的一维数组

     且不改变任何元素的序号。

2:T:矩阵的转置转置序号对A源列数取整后取余后可以得到转置后矩阵的行列数,转置后可默认新矩阵是行优先即可。





Matrix_LRT.PDF

.PDF改成.Smart打开

////////////////////////////////////////////////////////////////////////////////////////////////////////////

Matrix_Mull.PDF

.PDF改成.Smart打开

Matrix_Mull实现行优先排列矩阵A乘行优先排列矩阵B。清零C循环可省去放进行循环,列循环里清零也行。



      以上仅参考矩阵计算资料,未参考CSDN或其它任何资料,错漏难免,仅供参考。矩阵的加法,减法,数乘,左除,右除,微分,积分,差分,卷积,分块,加密,摄动,DFT/FFT,有限元,面元法,特征值,残差分解;以及方阵的逆,伴随等等可按类似思路参考名著矩阵计算或其它通用数学书籍来写。

     矩阵运算是GPU以及AI-TPU的稍强项,要耗费大量时间和空间。简单的可能还行,复杂的话想想还是放了200Smart吧。

完!

您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。