自动化中计算矩形料盘中各个物料的坐标位置、松下PLC、ST文本程序、
分类
一、矩形料盘两个边沿与XY轴平行(属于特殊情况,也较为常见)
示意图
其中
n、m、通过初期机械设计确定料盘尺寸大小
要计算出所有交点的坐标,法1、至少需要通过示教获得A、D、两点的坐标。
或者 法2、 通过示教获得A、B、C、三点的坐标(第二节使用)。
涉及的坐标值一般为电机的坐标值,通过触摸屏等示教得来。
使用松下PRO7设计程序如下
法1:该函数使用A、D、两点的坐标计算
输入输出IO定义如下
ST文本程序实现如下:
/*------ 料盘阵列计算------
通过起始点(Xa,Ya)、对角点两点(Xb,Yb)坐标、
料盘的行数rows、料盘的列数columns、计算其它点位的坐标
该方法适用于:
1、料盘平行X轴,平行Y轴的情况。
*/
/*计算物料之间的距离*/
//物料Y方向的距离差
if (ui总行数rows >1) then
r行距:=(r对角坐标Yb-r起始坐标Ya)/(TO_REAL(ui总行数rows)-1);
else
r行距:=0;
end_if;
//物料X方向的距离差
if (ui总列数cols>1) then
r列距:=(r对角坐标Xb-r起始坐标Xa)/(TO_REAL(ui总列数cols)-1);
else
r列距:=0;
end_if;
/*计算目标坐标值*/
//计算当前X坐标
if (ui当前列数 >= 1 AND ui当前列数<=ui总列数cols) then
r当前X坐标:=r起始坐标Xa + r列距*(TO_REAL(ui当前列数)-1);
else
r当前X坐标:=r起始坐标Xa;
end_if;
//计算当前Y坐标
if (ui当前行数 >= 1 AND ui当前行数<=ui总行数rows) then
r当前Y坐标:=r起始坐标Ya + r行距*(TO_REAL(ui当前行数)-1);
else
r当前Y坐标:=r起始坐标Ya;
end_if;
//错误提示
b行列数超限:= NOT(ui当前列数 >= 1 AND ui当前列数<=ui总列数cols) OR NOT (ui当前行数 >= 1 AND ui当前行数<=ui总行数rows);
FB 函数封装如下
二、倾斜矩形料盘,两个边沿与XY轴不平行
示意图
其中
n、m、通过初期机械设计确定料盘尺寸大小
要计算出所有交点的坐标,此时不能通过A、D、两点的坐标计算其它坐标点。
只能通过 法2、 通过示教获得A、B、C、三点的坐标。
使用松下PRO7设计程序如下
法2、 通过示教获得A、B、C、三点的坐标计算
输入输出IO定义如下
ST文本程序实现如下:
/*------ 料盘阵列计算------
通过起始点左下(Xa,Ya)、左上(Xb,Yb)、右下(Xc,Yc)三点坐标、
料盘的行数rows、料盘的列数columns、计算其它点位的坐标
该方法适用于
1、料盘平行X轴,平行Y轴的情况。
2、倾斜矩形料盘中物料位置的程序
3、AB不平行Y轴、不平行X轴,AC不平行Y轴、不平行X轴。
*/
/* 计算第四个角点D(右上角)(Xd,Yd)*/
//根据矩形性质,第四个角点D可以通过向量运算得到:D = B + C - A
r右上坐标Xd := r左上坐标Xb + r右下坐标Xc - r左下坐标Xa;
r右上坐标Yd := r左上坐标Yb + r右下坐标Yc - r左下坐标Ya;
/*计算行距的增量向量*/
//类似物料Y方向的距离差,行距
IF (ui总行数rows>1) THEN
Row_Vector_X := (r左上坐标Xb - r左下坐标Xa) / (TO_REAL(ui总行数rows) - 1);
Row_Vector_Y := (r左上坐标Yb - r左下坐标Ya) / (TO_REAL(ui总行数rows) - 1);
ELSE
Row_Vector_X := 0.0;
Row_Vector_Y := 0.0;
END_IF;
/* 计算列距的增量向量*/
//类似物料X方向的距离差,列距
IF (ui总列数cols > 1) THEN
Col_Vector_X := (r右下坐标Xc - r左下坐标Xa) / (TO_REAL(ui总列数cols) - 1);
Col_Vector_Y := (r右下坐标Yc - r左下坐标Ya) / (TO_REAL(ui总列数cols) - 1);
ELSE
Col_Vector_X := 0.0;
Col_Vector_Y := 0.0;
END_IF;
/*计算目标坐标值*/
//计算当前X坐标
if (ui当前列数 >= 1 AND ui当前列数<=ui总列数cols) AND (ui当前行数 >= 1 AND ui当前行数<=ui总行数rows) then
r当前X坐标:=r左下坐标Xa + Row_Vector_X*(TO_REAL(ui当前行数)-1) + Col_Vector_X *(TO_REAL(ui当前列数)-1);
r当前Y坐标:=r左下坐标Ya + Row_Vector_Y*(TO_REAL(ui当前行数)-1) + Col_Vector_Y *(TO_REAL(ui当前列数)-1);
else
r当前X坐标:=r左下坐标Xa;
r当前Y坐标:=r左下坐标Ya;
end_if;
//错误提示
//b行列数超限:= NOT(ui当前列数 >= 1 AND ui当前列数<=ui总列数cols) OR NOT (ui当前行数 >= 1 AND ui当前行数<=ui总行数rows);
b行列数超限:= ui当前列数 < 1 OR ui当前列数 > ui总列数cols OR ui当前行数 < 1 OR ui当前行数 > ui总行数rows;