SCL编写伺服控制程序可以使能位置+速度+模式+激活同时赋值吗?

ESP32-C3有一组硬件I2C,支持主机和从机模式,速度可支持标准模式和快速模式,最高可达800Kbit/s,但受限于SDA和SDL的上拉强度,芯片内部的SDA和SDL脚有上拉电阻可以配置。同时,引脚可以任意映射,如下图

接下来我将使用硬件I2C来驱动温湿度传感器SHT30

2、配置I2C的相关函数

这里直接调用API就行了,同时为了提高移植性,我将官方的API封装了一下,这样SHT30在调用的时候可以灵活切换软硬件I2C驱动函数,见下图

下图是在SHT30头文件里的宏定义,可以实现软硬件I2C灵活切换

SHT30的驱动函数网上也比较多,我就不细讲了,讲一些核心函数,我这里选用Singleshot模式来采集数据,首先要初始化SHT30,这里比较简单,就是I2C的初始化,见下图

4、配置读取SHT30数据的函数

首先要讲一下ESP32-C3的I2C的一些基本操作,包括主机向从机写入数据和主机从从机读取数据,具体的在官方编程指南了写的很明白了,见下图

这里需要注意一点,上边的步骤缺一不可

具体要怎么通过I2C来操作SHT30呢,当然是参考官方数据手册,下图是Singleshot模式的操作时序图

1、首先,发送开始信号,再发送write header,我这里是0x88,然后再发送16位的配置命令,比如配置成高重复性或者低重复性,这个可以参考数据手册或者互联网,我就不细讲了,最后发送停止信号,见下图的程序

同时,因为发送的3组8位数据都是有ACK响应的,所以要将使能主机检查ACK,也就是设置ACK_CHECK_EN

3、发送开始信号,写入read header,我这里的值为0x89,根据时序图,SHT30会返回一个NACK,所以可以不使能主机检查ACK,也就是设置ACK_CHECK_DIS,最后发送停止信号

5、再次发送开始信号,再写入read header,如果转换好了,SHT30会发送一个ACK,没有的话可以稍微延长延时时间,然后依次读写6组8位的SHT30返回的数据,这里注意一下,收到前5组数据时要发送ACK,最后1组不需要(虽然加了也没什么关系),然后再发送停止信号就好了。这里还需要注意一点,在读数据时一定要将从设备发送过来的数据全部读完,不然会莫名出问题的,踩了坑)

6、最后要验证收到的数据的正确性,要进行CRC验证,具体算法我就不讲了,大家可以看数据手册。其中temp[2]和humi[2]是CRC数据,如果数据验证正确,再对原始数据进行转换成真实数据。

下图为CRC验证算法和数据转换算法

最后在主函数调用如下函数

用串口打印如下结果,成功驱动

}

本回答由上海质祈机电设备有限公司提供

下载百度知道APP,抢鲜体验

使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。

}

      我接触过很多PLC的初学者,他们多数人在学习PLC时,过于专注于PLC的指令,但是对于PLC的学习而言,指令在学习过程中所占的比重不会超过一半。其中一项常常被忽略的就是PLC的数据类型,多数人在知道了二进制数、整数、浮点数等简单数据类型后,就认为已经认识了PLC的数据据类型,但这仅是PLC数据类型的皮毛。

   为什么要强调数据类型呢,因为如果能在编程过程中熟练运用各种数据类型,将使程序更加简单明了,增加程序可读性,甚至可以将复杂的算法简单化。尤其在SCL语言的加持下,配合数据类型的使用,将使编程技能得到极大提升。

西门子PLC中数据类型没有明确统一的划分,我们姑且将,二进制位、整数、浮点数、时间等归类为简单数据类型,这些对于有编程基础的人而言,不用过多赘述。数据类型还有常量和变量之分,常量使用技巧可以自行学习。

下面将除简单类型数据之外的数据类型大体分为三类:复杂数据、系统数据、硬件数据。

仅介绍常用的几种,有其他需要的可以自行查阅资料,学会自学才会真正进步。

ARRAY,即数组,有C或其他高级编程语言的人对它应该并不陌生,它是一组固定数量的相同数据类型元素的集合。在TIA PORTAL环境下的基本用法ARRAY[1..9] OF 数据类型。ARRAY几乎支持除ARRAY本身外所有的数据类型。

我们可以将数组分类为一维数组和多维数组,TIA PORTAL最大支持6维数组。

在TIA PORTAL中建立一维数组,如下图所示,数组的下限为0,上限为3,数据类型为INT,所以这给数组包含0-3共计4个INT类型的变量,他只有一组数据。一维数组的上下限必须为固定数值,不允许使用变量。数组依靠变量名+[]索引的方式来寻址,例如ARRAY1[0]为下图数组中的第一个整数。

在TIA PORTAL中建立二维数组,如下图所示,可以将二维数组理解为一张表格,0-2为行标,0-3为列标,所以它包含3*4共计12个浮点数。理解了二维数组后,我们可以建立三维或更多维数的数组,但是通常我们用到的只有一维和二维数组。

(注意,SCL中的变量只能使用标签,不能使用绝对地址,局部变量在SCL中用#+变量名称,全局变量用双引号加“变量名”)

   学会使用数组,在我们理解了数组之后,可以通过一个小程序案例感受一下数组的使用方法:

#ARRAY1[1];,此时element等于ARRAY数组中的第一个值,以此类推,i等于不同的值时(i必须在1-10之间),element等于数组中不同的元素值。

  比较复杂的用法在讲完流程控制语句后给程序示例。

STRUCT是由不同数据类型组成的结构体(数据结构),比如我们伺服的控制字,包含伺服使能、位置、速度、加减速时间等,他们数据类型不同,但都用来描述对伺服的控制,我们可以把它用一个结构体来表示;再比如描述一个物料信息时,我们也可以用一个数据结构把他们所包含的不同信息进行封装,诸如ID编号、重量等等。

下图以伺服控制字的方式建立一个STRUCT数据结构,在FB中的INPUT中建立,

当调用该FB时,STRUCT数据结构,只有一个引脚,很简洁。

UDT为用户自定义数据类型,其实它也是是由不同数据类型组成的结构体,但是STRUCT和UDT仍然有很大的区别,STRUCT称为数据结构,它仅仅将不同数据进行整合,它在作为一个整体使用时,具有单一性,每个STRUCT都可以有自己的结构。

UDT称为数据类型,它的用法像WORD INT REAL,只不过我们只是提前定义了一个类似结构体的数据类型,它在定义后,在程序中可以统一更改和重复使用,一旦某个新建的UDT中包含的元素更改后,使用该数据类型的变量都会更改。

建立UDT数据类型,需要在项目树中的PLC数据类型中新建,给数据类型命名,方便后续使用。

之前使用STRUCT建立伺服控制字,如果有多个伺服需要控制,则每个伺服都需要单独建立STRUCT类型,手动添加伺服的控制数据,而使用UDT可以解决这种情况,提高数据的复用性。

首先,建立名为UDT1的自定义数据类型,然后在工作区将伺服的控制数据依次添加。

在数据块中建立数据类型为UDT1的数据,如下图,此时【伺服控制字2】将自动生成UDT1内的数据类型,且为灰色(不可更改);这样多个伺服我们只需要一次建立UDT1类型的数据就可以了。

}

我要回帖

更多关于 伺服位置指令给定有几种方式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信