CODESYS中SM3_Math库中的向量运算

sySeDoC

SMC_VECTOR3D

SMC_VECTOR3D是SM3_Math库中的3维向量数据结构,形式如下:

TYPE SMC_VECTOR3D :
STRUCT
    dX:LREAL;
    dY:LREAL;
    dZ:LREAL;
END_STRUCT
END_TYPE

SMC_V3_Add (FUN)

功能:两个3维向量的加法
参数:
image.png
示例:
声明部分:

PROGRAM PLC_PRG
VAR
    vDst: SM3M.SMC_Vector3D;
    vLhs: SM3M.SMC_Vector3D:=(dX := 1, dY := 3, dZ := 5);
    vRhs: SM3M.SMC_Vector3D:=(dX := 2, dY := 4, dZ := 6);
END_VAR

实现部分:

SMC_V3_Add(vDst:= vDst, vLhs:= vLhs, vRhs:= vRhs);

执行结果:
image.png

SMC_V3_Angle (FUN)

功能:计算两个3维向量之间的角度(以弧度为单位)。注意:如果向量之一的长度为零,则结果为零。返回的值在[0 .. pi]范围内。
参数:
image.png
示例:
声明部分:

PROGRAM PLC_PRG
VAR
    v1: SM3M.SMC_Vector3D:=(dX := 1, dY := 0, dZ := 0);
    v2: SM3M.SMC_Vector3D:=(dX := 0, dY := 1, dZ := 0);
    angle: LREAL;
END_VAR

实现部分:

angle:=SMC_V3_Angle(v1:= v1, v2:= v2);

执行结果:
image.png

SMC_V3_CloseRel (FUN)

功能:判断两个向量a和b的相对差是否最大为epsilon,即|a-b|<= eps * MAX(|a|,|b|)是否成立。|.| 表示欧几里得范数。
参数:
image.png
示例:
声明部分:

PROGRAM PLC_PRG
VAR
    a: SM3M.SMC_Vector3D:=(dX := 1, dY := 0, dZ := 0);
    b: SM3M.SMC_Vector3D:=(dX := 0.99, dY := 0.01, dZ := 0);
    result: BOOL;
END_VAR

实现部分:

result:= SMC_V3_CloseRel(a:= a, b:= b, eps:= 0.1);

执行结果:
image.png

SMC_V3_Cross (FUN)

功能:3维向量的叉乘,即求同时垂直两个向量的向量:vDst:= vLhs x vRhs。
参数:
image.png
示例:
声明部分:

PROGRAM PLC_PRG
VAR
    vDst: SM3M.SMC_Vector3D;
    vLhs: SM3M.SMC_Vector3D:=(dX := 1, dY := 3, dZ := 5);
    vRhs: SM3M.SMC_Vector3D:=(dX := 2, dY := 4, dZ := 6);
END_VAR

实现部分:

SMC_V3_Sub(vDst:= vDst, vLhs:= vLhs, vRhs:= vRhs);

执行结果:
image.png

SMC_V3_DistE (FUN)

功能:计算两个向量的欧式距离。
参数:
image.png
示例:
声明部分:

PROGRAM PLC_PRG
VAR
    v0: SM3M.SMC_Vector3D:=(dX := 1, dY := 3, dZ := 5);
    v1: SM3M.SMC_Vector3D:=(dX := 2, dY := 4, dZ := 6);
    DistE:LREAL;
END_VAR

实现部分:

DistE := SMC_V3_DistE(v0:= v0, v1:= v1);

执行结果:
image.png

SMC_V3_Dot (FUN)

功能:计算两个向量点乘。
参数:
image.png
示例:
声明部分:

PROGRAM PLC_PRG
VAR
    v1: SM3M.SMC_Vector3D:=(dX := 1, dY := 3, dZ := 5);
    v2: SM3M.SMC_Vector3D:=(dX := 2, dY := 4, dZ := 6);
    Dot:LREAL;
END_VAR

实现部分:

Dot := SMC_V3_Dot(v1:= v1, v2:= v2);

执行结果:
image.png

SMC_V3_DotSq (FUN)

功能:计算向量与自身的点乘。
参数:
image.png
示例:
声明部分:

PROGRAM PLC_PRG
VAR
    v: SM3M.SMC_Vector3D:=(dX := 1, dY := 3, dZ := 5);
    DotSq:LREAL;
END_VAR

实现部分:

DotSq := SMC_V3_DotSq(v:= v);

执行结果:
image.png

SMC_V3_IsScalarMultiple

功能:判断是否存在实数lambda,使得v = lambda * u,即判断两个向量是否共线。(请注意,lambda可以为零或负值。)
参数:
image.png
示例:
声明部分:

PROGRAM PLC_PRG
VAR
    u: SM3M.SMC_Vector3D:=(dX := 1, dY := 3, dZ := 5);
    v: SM3M.SMC_Vector3D:=(dX := 2, dY := 6, dZ := 9.9);
    dEps:BOOL;
END_VAR

实现部分:

dEps :=SMC_V3_IsScalarMultiple(u:= u, v:= v, dEps:= 0.1);

执行结果:
image.png

SMC_V3_Lint (FUN)

功能:在两个向量之间线性内插:vDst:= vLhs *(1-lambda)+ vRhs * lambda。
参数:
image.png
示例:
声明部分:

PROGRAM PLC_PRG
VAR
    vDst: SM3M.SMC_Vector3D;
    vLhs: SM3M.SMC_Vector3D:=(dX := 1, dY := 3, dZ := 5);
    vRhs: SM3M.SMC_Vector3D:=(dX := 2, dY := 4, dZ := 6);
END_VAR

实现部分:

SMC_V3_Lint(vDst:= vDst, vLhs:= vLhs, vRhs:= vRhs, lambda:= 0.1);

执行结果:
image.png

SMC_V3_MAdd (FUN)

功能:向量与数乘向量的加法:vDst := vLhs + d * vRhs.
参数:
image.png
示例:
声明部分:

PROGRAM PLC_PRG
VAR
    vDst: SM3M.SMC_Vector3D;
    vLhs: SM3M.SMC_Vector3D:=(dX := 1, dY := 3, dZ := 5);
    vRhs: SM3M.SMC_Vector3D:=(dX := 2, dY := 4, dZ := 6);
END_VAR

实现部分:

SMC_V3_MAdd(vDst:= vDst, vLhs:= vLhs, vRhs:= vRhs,d:=d);

执行结果:
image.png

SMC_V3_Max_Cmp (FUN)

功能:计算两个向量的按分量最大值。两个向量必须具有相同的维度。
参数:
image.png
示例:
声明部分:

PROGRAM PLC_PRG
VAR
    vDst: SM3M.SMC_Vector3D;
    vLhs: SM3M.SMC_Vector3D:=(dX := 1, dY := 3, dZ := 5);
    vRhs: SM3M.SMC_Vector3D:=(dX := 3, dY := 5, dZ := 1);
END_VAR

实现部分:

SMC_V3_Max_Cmp(vDst:= vDst, v0:= v0, v1:= v1);

执行结果:
image.png

SMC_V3_Min_Cmp (FUN)

功能:计算两个向量的按分量最小值。 两个向量必须具有相同的维度。
参数:
image.png
示例:
声明部分:

PROGRAM PLC_PRG
VAR
    vDst: SM3M.SMC_Vector3D;
    vLhs: SM3M.SMC_Vector3D:=(dX := 1, dY := 3, dZ := 5);
    vRhs: SM3M.SMC_Vector3D:=(dX := 3, dY := 5, dZ := 1);
    d:LREAL:=2;
END_VAR

实现部分:

SMC_V3_Min_Cmp(vDst:= vDst, v0:= v0, v1:= v1);

执行结果:
image.png

SMC_V3_Mult (FUN)

功能:将向量乘以标量:vDst:= d * vSrc。
参数:
image.png
示例:
声明部分:

PROGRAM PLC_PRG
VAR
    vDst: SM3M.SMC_Vector3D;
    vSrc: SM3M.SMC_Vector3D:=(dX := 1, dY := 3, dZ := 5);    
    d: LREAL:=2;
END_VAR

实现部分:

SMC_V3_Mult(vDst:= vDst, vSrc:= vSrc, d:= d);

执行结果:
image.png

SMC_V3_NormE (FUN)

功能:计算向量的欧几里得范数
参数:
image.png
示例:
声明部分:

PROGRAM PLC_PRG
VAR
    v: SM3M.SMC_Vector3D:=(dX := 1, dY := 3, dZ := 5);    
    NormE: LREAL;
END_VAR

实现部分:

NormE:=SMC_V3_NormE(v:= v);

执行结果:
image.png

SMC_V3_NormMax (FUN)

功能:计算向量的最大范数。
参数:
image.png
示例:
声明部分:

PROGRAM PLC_PRG
VAR
    v: SM3M.SMC_Vector3D:=(dX := 1, dY := 3, dZ := 5);    
    NormMax: LREAL;
END_VAR

实现部分:

NormMax:=SMC_V3_NormMax(v:= v);

执行结果:
image.png

SMC_V3_Serialize (FUN)

功能:向量序列化。
参数:
image.png
示例:
声明部分:

PROGRAM PLC_PRG
VAR
    v: SM3M.SMC_Vector3D:=(dX := 1, dY := 3, dZ := 5);    
    stream: SM3M.SM0.OutStringStream;
    result:BOOL;
END_VAR

实现部分:

result:=SMC_V3_Serialize(stream:= stream, v:= v);

执行结果:
image.png

SMC_V3_Sub (FUN)

功能:两个3维向量的减法
参数:
image.png
示例:
声明部分:

PROGRAM PLC_PRG
VAR
    vDst: SM3M.SMC_Vector3D;
    vLhs: SM3M.SMC_Vector3D:=(dX := 1, dY := 3, dZ := 5);
    vRhs: SM3M.SMC_Vector3D:=(dX := 2, dY := 4, dZ := 6);
END_VAR

实现部分:

SMC_V3_Sub(vDst:= vDst, vLhs:= vLhs, vRhs:= vRhs);

执行结果:
image.png

未完待续。。。

阅读 580
1 声望
0 粉丝
0 条评论
你知道吗?

1 声望
0 粉丝
宣传栏