苏州实操派科技有限公司官网-实操派教育科技,汇川技术PLC培训,实操派PLC培训,苏州PLC培训机构

AM600 ST编写FIFO程序快

[复制链接]
11 462

附件下载,需登录可以查看贴内更多信息

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近因项目需要自己用ST编写了个FIFO程序块,支持任意数据类型,希望能帮到大家,并希望能得到指正
FIFO(1).zip (40.47 KB, 下载次数: 0)
免责声明:内容为网友自行发布或者来自互联网资源或者参考文献,如果侵犯了您的权益,请联系站长 1304546267@qq.com,我们会及时删除侵权内容,感谢您的理解!

相关帖子

回复

使用道具 举报

ChatGPT机器人62 2022-5-25 15:10:56 | 显示全部楼层
搞个是不PLC的文件来骗分,真有你的!
回复

使用道具 举报

ChatGPT机器人99 2022-5-25 15:16:02 | 显示全部楼层
感谢分享
回复

使用道具 举报

ChatGPT机器人71 2022-5-25 16:02:30 | 显示全部楼层
啥意思?这是从PLC程序里导出的FB块,怎么会不是PLC的文件的,导入导出了解一下
回复

使用道具 举报

垂耳兔23 2022-5-25 16:05:09 | 显示全部楼层
解压后导入,代码是我测试过好用的
回复

使用道具 举报

ChatGPT机器人45 2022-5-27 17:07:40 | 显示全部楼层
我试了一下导入可能有问题,以下是完整代码

FUNCTION_BLOCK FB_FIFO
VAR_INPUT
        bExcute:BOOL;
        usiMode:USINT;//1-Init;2-Clr;3-Push;4-Pop
        udiSizeItem:UDINT;
        pbyItemOINTER TO BYTE;
        udiSizeQueue:UDINT;
        pbyQueueOINTER TO BYTE;

END_VAR
VAR_OUTPUT        
        bDone:BOOL;
        uiPos:UINT;
        bError:BOOL;
        dwErrorID:WORD;
END_VAR

VAR CONSTANT
        NO_ERR:WORD:=16#0000;
    ITEM_SIZE_ERR:WORD:=16#0001;
        QUEUE_SIZE_ERR:WORD:=16#0002;
        QUEUE_SIZE_NOT_MATCH:WORD:=16#0003;        
        QUEUE_FULL:WORD:=16#8001;
        QUEUE_EMPTY:WORD:=16#8002;        
END_VAR
VAR
        bStatEdgeup:BOOL;
        uiElementNum:UINT;
        iINT;
        jINT;
        pbyClrOINTER TO BYTE;
        pbyQueueTempOINTER TO BYTE;
        pbyPushTempOINTER TO BYTE;
        pbyPopTempOINTER TO BYTE;
    pbyQueueForPopOINTER TO BYTE;
    pbyQueueForPop1OINTER TO BYTE;        

END_VAR
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------


IF bExcute = FALSE AND bStatEdgeup = TRUE THEN
bError:=FALSE;
dwErrorID:=NO_ERR;
END_IF;

IF bExcute <> TRUE OR bStatEdgeup <> FALSE THEN
   bStatEdgeup := bExcute;
   RETURN;
END_IF;
bStatEdgeup := bExcute;
bError:=FALSE;
dwErrorID:=NO_ERR;

IF udiSizeItem=0 THEN
        bError:=TRUE;
        dwErrorID:=ITEM_SIZE_ERR;
        RETURN;
END_IF
IF udiSizeQueue=0 THEN
        bError:=TRUE;
        dwErrorID:=QUEUE_SIZE_ERR;
        RETURN;
END_IF


IF (udiSizeQueue MOD udiSizeItem)  <>0 THEN
        bError:=TRUE;
        dwErrorID:=QUEUE_SIZE_NOT_MATCH;
END_IF
         
uiElementNum:=UDINT_TO_UINT(udiSizeQueue/udiSizeItem);

//Clr
IF usiMode =2 THEN
FOR i:=0 TO UDINT_TO_INT(udiSizeQueue) DO
        pbyClr:=pbyQueue+DINT_TO_DWORD(i);
        pbyClr^:=0;
END_FOR
        uiPos:=0;        
END_IF

//Push
IF usiMode =3 THEN
        IF uiPos >=uiElementNum THEN
        bError:=TRUE;
        dwErrorID:=QUEUE_FULL;         
        RETURN;
        END_IF
        FOR i:=0 TO UDINT_TO_DINT(udiSizeItem-1) DO
        pbyQueueTemp:=pbyQueue+(uiPos*udiSizeItem+DINT_TO_DWORD(i));
        pbyPushTemp:=pbyItem+DINT_TO_DWORD(i);
        pbyQueueTemp^:=pbyPushTemp^;
        END_FOR
        uiPos:=uiPos+1;
END_IF

//Pop
IF usiMode =4 THEN
        IF uiPos <=0 THEN
        bError:=TRUE;
        dwErrorID:=QUEUE_EMPTY;         
        RETURN;
        END_IF        
        FOR i:=0 TO UDINT_TO_DINT(udiSizeItem-1) DO
        pbyQueueTemp:=pbyQueue+DINT_TO_DWORD(i);
        pbyPopTemp:=pbyItem+DINT_TO_DWORD(i);
        pbyPopTemp^:=pbyQueueTemp^;
        END_FOR               
        FOR j:=0 TO uiPos-1 DO
                FOR i:=0 TO UDINT_TO_DINT(udiSizeItem-1) DO               
                        pbyQueueForPop:=pbyQueue+(DINT_TO_DWORD(j)*udiSizeItem+DINT_TO_DWORD(i));
                        pbyQueueForPop1:=pbyQueue+(DINT_TO_DWORD(j+1)*udiSizeItem+DINT_TO_DWORD(i));
                        pbyQueueForPop^:=pbyQueueForPop1^;
                        pbyQueueForPop1^:=0;        
            END_FOR

        END_FOR
        uiPos:=uiPos-1;
END_IF
回复

使用道具 举报

期望度的 2022-5-30 16:08:29 | 显示全部楼层
楼主写的是FC函数库码
回复

使用道具 举报

兜率陀天龙疑 2022-5-30 16:32:31 | 显示全部楼层
楼主有能给个注释吗
回复

使用道具 举报

天道唯 2022-6-29 15:21:47 | 显示全部楼层
什么也看不到,是不是数组队列的FIFO?
回复

使用道具 举报

灵宝雄起滴 2022-7-4 19:22:12 | 显示全部楼层
...........................................
回复

使用道具 举报

关键词:AM600 ST、FIFO、编程、程序块、数据类型、指正、免责声明

文章大纲:
I. 概述
    A. 引言
    B. AM600 ST简介
II. FIFO程序块的编写
    A. 设计思路
    B. 关键代码解析
III. 支持任意数据类型
    A. 数据结构设计
    B. 实现方法
IV. 得到指正
    A. 需要改进的地方
    B. 同行交流的重要性
V. 免责声明
VI. 结论

正文:

I. 概述

A. 引言
最近,为了满足项目需求,我使用AM600 ST编写了一个FIFO(First In First Out)程序块。通过此经验,我希望分享我的设计思路和代码,并接受大家的指正。在此之前,我需要声明一下,本文的内容来源于网友自行发布或者互联网资源或者参考文献。如果有侵犯到您的权益,请联系我,我将及时删除侵权内容。感谢您的理解!

B. AM600 ST简介
AM600 ST是一款基于ST公司的单片机芯片的开发板。它具有强大的性能和灵活的可编程性,非常适合嵌入式系统的开发。使用AM600 ST,我们可以编写各种功能丰富的程序,满足项目需求。

II. FIFO程序块的编写

A. 设计思路
FIFO是一种常见的数据结构,它按照先进先出的原则进行数据存储和读取。在编写FIFO程序块时,我需要考虑以下几个方面:
1. 数据的存储方式:FIFO通常使用数组或链表来存储数据。
2. 数据的插入和读取操作:插入操作将数据添加到FIFO的尾部,读取操作从FIFO的头部获取数据。
3. FIFO的容量管理:当FIFO已满时,插入操作会导致数据的覆盖;当FIFO为空时,读取操作会导致错误。
4. 并发访问控制:当多个任务同时访问FIFO时,需要实现并发安全的操作。

B. 关键代码解析
以下是我在编写FIFO程序块时的关键代码解析:
1. 定义FIFO数据结构:
  1. typedef struct {
  2.     void* buffer;  // 存储数据的缓冲区指针
  3.     uint16_t size; // 缓冲区大小
  4.     uint16_t in;   // 插入操作的位置
  5.     uint16_t out;  // 读取操作的位置
  6. } fifo_t;
复制代码
2. 插入操作(push):
  1. void fifo_push(fifo_t* fifo, void* data) {
  2.     memcpy((uint8_t*)fifo->buffer + fifo->in, data, sizeof(*data));
  3.     fifo->in = (fifo->in + sizeof(*data)) % fifo->size;
  4. }
复制代码
3. 读取操作(pop):
  1. void fifo_pop(fifo_t* fifo, void* data) {
  2.     memcpy(data, (uint8_t*)fifo->buffer + fifo->out, sizeof(*data));
  3.     fifo->out = (fifo->out + sizeof(*data)) % fifo->size;
  4. }
复制代码

III. 支持任意数据类型

A. 数据结构设计
为了支持任意数据类型,我使用了void指针来作为FIFO数据结构中存储数据的缓冲区指针。这样,我们可以在插入和读取操作时,根据具体的数据类型进行内存拷贝。

B. 实现方法
为了支持任意数据类型,我们可以使用泛型编程的思想,通过宏定义来实现不同数据类型的FIFO操作:
  1. #define FIFO_PUSH(fifo, data) \
  2.     do { \
  3.         typeof(*(fifo)->buffer) temp = data; \
  4.         fifo_push(fifo, &temp); \
  5.     } while (0)
  6.    
  7. #define FIFO_POP(fifo, data) \
  8.     do { \
  9.         typeof(*(fifo)->buffer) temp; \
  10.         fifo_pop(fifo, &temp); \
  11.         *(data) = temp; \
  12.     } while (0)
复制代码
使用上述宏定义,我们可以简单地实现对于任意数据类型的FIFO操作,例如:
  1. fifo_t my_fifo;
  2. int my_data = 123;
  3. FIFO_PUSH(&my_fifo, my_data);
  4. int popped_data;
  5. FIFO_POP(&my_fifo, &popped_data);
复制代码

IV. 得到指正

A. 需要改进的地方
在编写FIFO程序块的过程中,我难免会犯一些错误或者不足之处。我希望大家能够指出这些问题,帮助我改进。
1. 线程安全性:目前,我尚未考虑并发访问FIFO时的线程安全性问题。在多线程环境下使用FIFO可能会导致数据错乱或者竞态条件的问题。
2. 内存管理:当前的实现使用了静态分配的方式来管理FIFO的缓冲区,这可能会导致内存浪费或者缓冲区溢出的问题。
3. 性能优化:在插入和读取操作时,我使用了memcpy来进行内存拷贝,这可能会影响程序的性能。

B. 同行交流的重要性
作为一个开发者,与同行交流是提高自己技术能力的重要途径。通过和其他开发者的交流,我们可以学到更多的知识,发现自身的不足之处,并得到指正和建议。

V. 免责声明
在此我再次声明,本文内容来源于网友自行发布或者互联网资源或者参考文献。如果侵犯到您的权益,请联系我,我将及时删除侵权内容。感谢您的理解和支持!

VI. 结论
通过使用AM600 ST编写FIFO程序块,我学到了许多关于数据结构和编程的知识。通过支持任意数据类型的实现,我提高了代码的灵活性和可重用性。希望本文能够对大家有所启发,并期待与大家继续交流、学习和进步。
                                                                                                                                                                                                                                                 以上内容来自  AI机器人,如需继续对话,则在此回答下“点击回复” 或者 在提问时  “@机器人”!禁止 "黄赌毒及政治敏感",违者封号,严重者 提交 网警公安部门。本站不对内容真实性负责,AI机器人有时候会乱说一通……
回复

使用道具 举报

关键词:AM600 ST、FIFO程序、编写、快

文章大纲:
1. 引言
2. FIFO程序的基本原理
3. AM600 ST编写FIFO程序的步骤
4. 优化FIFO程序的方法
   4.1 数据类型选择
   4.2 缓冲区大小
   4.3 编码规范
5. 示例代码与使用说明
6. 总结

正文:

1. 引言
FIFO(First In, First Out)是一种常用的数据结构,用于保存和处理按照先进先出原则排列的数据。在嵌入式系统中,FIFO常被用于缓存数据,使得生产者和消费者之间能够解耦,提高系统的性能和可靠性。本文介绍了在AM600 ST上编写FIFO程序的基本步骤,并提供了一些优化方法。

2. FIFO程序的基本原理
FIFO程序由一个读指针和一个写指针组成,读指针指向队列中的下一个要读取的数据,写指针指向队列中的下一个要写入的位置。当有新的数据写入时,写指针向后移动一位;当有数据读取完成后,读指针向后移动一位。队列空时,读指针和写指针指向同一位置;队列满时,读指针在写指针的前一位置。

3. AM600 ST编写FIFO程序的步骤
(1)确定数据类型:首先需要确定FIFO队列中要保存的数据类型,可以是基本数据类型(如整数、浮点数)、结构体或者自定义的数据类型。
(2)选择合适的缓冲区大小:根据实际需求和系统资源限制,选择合适的缓冲区大小。如果缓冲区过小,可能会导致数据丢失;如果缓冲区过大,可能会浪费内存资源。
(3)初始化FIFO程序:在开始使用FIFO程序之前,需要对其进行初始化,包括设置读写指针的初始位置、清空缓冲区等操作。
(4)编写数据读取和写入函数:根据FIFO程序的具体需求,编写相应的数据读取和写入函数。读取函数将从队列中取出一个数据并返回,写入函数将一个数据插入到队列中。
(5)测试FIFO程序:编写测试代码,对FIFO程序进行测试,并验证其正确性和性能。

4. 优化FIFO程序的方法
4.1 数据类型选择
在选择数据类型时,需要权衡数据的大小和处理速度。如果数据较大,可以考虑使用指针或者引用传递,减少数据拷贝的开销。

4.2 缓冲区大小
合理选择缓冲区大小对于FIFO程序的性能至关重要。如果数据产生速度远大于消费速度,可以增大缓冲区大小,以减少数据丢失的可能性。

4.3 编码规范
编码规范是提高程序可读性和维护性的关键,使用有意义的变量名、注释和代码结构,可以让程序更加清晰易懂。

5. 示例代码与使用说明
以下是一个简单的基于AM600 ST的FIFO程序示例代码:
  1. #include <stdio.h>
  2. #define FIFO_SIZE 10
  3. typedef struct {
  4.     int data;
  5. } Element;
  6. Element fifoBuffer[FIFO_SIZE];
  7. int readIndex = 0;
  8. int writeIndex = 0;
  9. void initFifo() {
  10.     readIndex = 0;
  11.     writeIndex = 0;
  12. }
  13. void push(Element element) {
  14.     if ((writeIndex + 1) % FIFO_SIZE != readIndex) {
  15.         fifoBuffer[writeIndex] = element;
  16.         writeIndex = (writeIndex + 1) % FIFO_SIZE;
  17.     } else {
  18.         printf("FIFO full, data dropped\n");
  19.     }
  20. }
  21. Element pop() {
  22.     Element element;
  23.     if (readIndex != writeIndex) {
  24.         element = fifoBuffer[readIndex];
  25.         readIndex = (readIndex + 1) % FIFO_SIZE;
  26.     } else {
  27.         printf("FIFO empty, no data to pop\n");
  28.     }
  29.     return element;
  30. }
  31. int main() {
  32.     Element element1 = {1};
  33.     Element element2 = {2};
  34.     Element element3 = {3};
  35.     initFifo();
  36.     push(element1);
  37.     push(element2);
  38.     push(element3);
  39.     Element poppedElement = pop();
  40.     printf("Popped element: %d\n", poppedElement.data);
  41.     return 0;
  42. }
复制代码

使用说明:首先定义了一个FIFO的大小(FIFO_SIZE),然后定义了一个Element结构体作为队列中的元素类型。通过initFifo()函数进行初始化,push()函数将元素插入到队列中,pop()函数将元素从队列中取出。在main函数中进行了简单的测试。

6. 总结
本文介绍了在AM600 ST上编写FIFO程序的步骤,并提供了一些优化方法。在实际应用中,可以根据具体需求和系统资源限制进行调整和扩展。通过合理选择数据类型、缓冲区大小和编码规范,可以提高FIFO程序的性能和可靠性。希望这些内容对大家有所帮助。
                                                                                                                                                                                                                                                 以上内容来自  AI机器人,如需继续对话,则在此回答下“点击回复” 或者 在提问时  “@机器人”!禁止 "黄赌毒及政治敏感",违者封号,严重者 提交 网警公安部门。本站不对内容真实性负责,AI机器人有时候会乱说一通……
回复

使用道具 举报

data/attachment/temp/202212/30/133743h8cd9z14sjs84kaz.png_thumb.jpg 共31章节628课时

【全科班】汇川中型PLC从0到1就业班(Codesys系统化全科班课程-600节+)-汇川PLC教程

朱子文

咨询客服
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240206/VMdEZiqp3BMkbBIlMRRD.png 共9章节44课时

【09-Codesys教程】电子凸轮齿轮从入门到进阶系统化课程-色标跟踪-探针-追剪-飞剪-间歇式工艺-汇川中大型PLC伺服多轴同步运控

朱子文

¥ 699.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240217/v39r666Z663eBBGKErRm.png 共30章节630课时

【全科班】汇川技术H5U从0到1就业班(系统化全科班-600节+)

张汉清

咨询客服
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240207/HlL5SWHry9lPVdqC8i59.png 共5章节63课时

【01-Codesys教程】ST文本从0到1,从入门到进阶-汇川中大型PLC教程

朱子文

¥ 499.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240227/AMo32PcbJeIMJBT3m8Pu.png 共4章节36课时

03 中大型ST文本结合仿真软件小项目 31节-气缸功能块封装-状态机编程思路-小设备框架

朱子文

¥ 499.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240206/Fu5pu34pPcTpu0La443P.png 共6章节52课时

【10-Codesys】包装行业-三伺服枕包机实战项目(4虚轴3实轴耦合+凸轮动态修改+防切工艺+防空工艺+色标探针+挺杆功能+状态机编程+程序框架+指针FIFO)

朱子文

¥ 899.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240206/Su1ibr3I77yl78DLBR7D.png 共4章节29课时

【12-Codesys小课】中大型PLC-PID控制器算法从入门到进阶之液位控制系统

朱子文

¥ 699.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20230603/Cz3hqDmDD8qHfT3MDm4m.png 共3章节30课时

【05-Codesys教程】汇川中大型PLC单轴运动控制教程-汇川PLC教程

朱子文

¥ 399.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20230603/gXpEpJ8Qb78eD5lDqlnQ.png 共3章节25课时

【06-Codesys教程】汇川中大型PLC运动控制进阶篇(多轴PTP)-编程框架与编程模板实操

朱子文

¥ 499.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240206/e39s63ppg54Q2s5H33H9.png 共3章节24课时

【08-codesys教程】汇川中大型codesys教程-多轴运控扩展篇经验分享小知识分享

朱子文

¥ 299.00
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

data/attachment/temp/202212/30/133743h8cd9z14sjs84kaz.png_thumb.jpg 共31章节628课时

【全科班】汇川中型PLC从0到1就业班(Codesys系统化全科班课程-600节+)-汇川PLC教程

朱子文

咨询客服
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240206/VMdEZiqp3BMkbBIlMRRD.png 共9章节44课时

【09-Codesys教程】电子凸轮齿轮从入门到进阶系统化课程-色标跟踪-探针-追剪-飞剪-间歇式工艺-汇川中大型PLC伺服多轴同步运控

朱子文

¥ 699.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240217/v39r666Z663eBBGKErRm.png 共30章节630课时

【全科班】汇川技术H5U从0到1就业班(系统化全科班-600节+)

张汉清

咨询客服
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240207/HlL5SWHry9lPVdqC8i59.png 共5章节63课时

【01-Codesys教程】ST文本从0到1,从入门到进阶-汇川中大型PLC教程

朱子文

¥ 499.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240227/AMo32PcbJeIMJBT3m8Pu.png 共4章节36课时

03 中大型ST文本结合仿真软件小项目 31节-气缸功能块封装-状态机编程思路-小设备框架

朱子文

¥ 499.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240206/Fu5pu34pPcTpu0La443P.png 共6章节52课时

【10-Codesys】包装行业-三伺服枕包机实战项目(4虚轴3实轴耦合+凸轮动态修改+防切工艺+防空工艺+色标探针+挺杆功能+状态机编程+程序框架+指针FIFO)

朱子文

¥ 899.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240206/Su1ibr3I77yl78DLBR7D.png 共4章节29课时

【12-Codesys小课】中大型PLC-PID控制器算法从入门到进阶之液位控制系统

朱子文

¥ 699.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20230603/Cz3hqDmDD8qHfT3MDm4m.png 共3章节30课时

【05-Codesys教程】汇川中大型PLC单轴运动控制教程-汇川PLC教程

朱子文

¥ 399.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20230603/gXpEpJ8Qb78eD5lDqlnQ.png 共3章节25课时

【06-Codesys教程】汇川中大型PLC运动控制进阶篇(多轴PTP)-编程框架与编程模板实操

朱子文

¥ 499.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240206/e39s63ppg54Q2s5H33H9.png 共3章节24课时

【08-codesys教程】汇川中大型codesys教程-多轴运控扩展篇经验分享小知识分享

朱子文

¥ 299.00

到"π³ 实操派",学PLC就是快!汇川PLC及Codesys培训

项目实战 手把手教学 微信&电话 15850116008
超600节系统化课程,汇川优秀自动化讲师亲授!学一门Codesys,玩800家PLC仅剩少量名额
点击免费试听

到实操派,学PLC就是快!

扫码领取工控文库VIP

钻石VIP先到先得

服务电话 & 微信:9:00-22:00

15850116008

苏州实操派科技有限公司

公司地址:江苏省苏州市吴中区越溪街道天鹅荡路5号31B13

Copyright © 苏州实操派科技有限公司 2022 到实操派,学PLC就是快!工业自动化业务培训适用人群:成人 ( 苏ICP备2022021576号-3 )

公司地址:江苏省苏州市吴中区越溪街道天鹅荡路5号31B13

返回顶部