PLC库 – Fulmatic核心 – PLC固件

我们的目标:该库旨在帮助您构建自己的PLC 。它致力于创建一个可使用Fulmatic SOFT编程的设备生态系统,让您最大限度地控制硬件。您可以将此功能强大的库与您选择的任何芯片和IDE配合使用。您可以自行定义电路图和所有其他硬件规格。

Fulmatic SOFT:按照说明将 Fulmatic Core 库添加到您的芯片代码中,即可使用梯形图IEC 61131-3 )语言通过Fulmatic SOFT对嵌入式系统进行编程。Fulmatic SOFT不仅仅是一个 PLC,它具备现代 PLC 的所有功能,并支持 TCP、UDP、运动控制和 SD 卡命令。Fulmatic SOFT 提供庞大的工作空间,包含 771 个模块(255 个 DB、256 个 PB、256 个 FB 和 4 个 OB)以及 16384 个 I/O。

免费PLC固件:您可以免费使用最大2048字节的PLC库(DB0占用1026字节)。如果需要更多内存,则必须购买许可证(10美元)。没有许可证,PLC将运行60分钟。我们透明的许可模式无需合同或复杂的流程。您需要在电路中添加一个TSHA204A-SSHDA芯片。购买许可证后,您将获得一个密钥。许可应用程序将使用此密钥连接到我们的服务器,并通过串口或以太网将许可证代码上传到芯片。服务器上的许可证数量将同时减少。

GitHub:您可以从 GitHub 下载我们使用 VS Code 为 STM32F407VGTx 准备的示例项目,以便测试PLC库。https ://github.com/FultekPLC/Plc-Firmware

在这个项目中,您将找到完整的PLC固件,它几乎利用了芯片的所有功能,并且是开源的。您可以使用Cube MX软件修改芯片的硬件规格,并继续开发同一个项目。您也可以使用VS Code修改硬件规格和软件。您可以向PLC固件添加自定义函数,并在PLC代码中运行它们。您可以使用任何品牌和型号的ARM芯片,只需指定I/O的数量和类型即可。简而言之,您可以根据许可条款不受任何限制地使用Fulmatic Core库。

固件更新:使用贵公司产品的客户可以使用 Fulmatic SOFT 进行PLC固件更新。PLC 固件更新代码完全开源,您可以在示例项目中查看和修改引导加载程序代码。除了我们推荐的代码外,您还可以编写自己的引导加载程序代码。

代码指南

我们正在努力使这个256 KB 的示例项目更易于使用。256 KB 的芯片代码确实是一个相当大的项目。理解、修改和实现如此庞大的项目并非易事。我们已尝试在本页面和代码中解释各项功能,并正在努力完善解释。我们会在 GitHub 代码库的讨论区尽可能多地解答您的问题。遗憾的是,我们不提供 Fulmatic Core 的免费支持。您可以联系我们获取报价,我们将代表您处理所有流程,包括电路板设计。

您可以从我们的 GitHub 链接下载示例项目:https://github.com/FultekPLC/Plc-Firmware。在示例项目中,您可以使用开源代码查看和修改 PLC 的所有功能。您可以删除不需要的功能并添加新功能。

您可以在我们的 GitHub 代码库中找到所有关于 IDE 和构建工具的信息。在本页中,我们将解释用于将库集成到您的 MCU 代码中的函数。

FulmaticConfig.h

此文件中定义了固件版本和字符串大小。

FulmaticCore.h

此文件包含库中函数的头文件,您将从 MCU 代码中调用这些函数。您可以在此文件中找到所有函数的描述。该库使用许多变量和字符串。您必须在 MCU 代码中创建这些变量和字符串。`variables_TypeDef` 结构用于将您创建的变量传递给库。您不能修改此结构。

FulmaticInit:此命令只需在芯片首次上电时运行一次。返回 1 表示已正确读取许可证芯片并已获得许可运行。

FulmaticExecute是main.c 中调用的一个函数,用于执行PLC 梯形图代码。它会在 Startup 块(PLC 启动时)、Main 块(每个循环时)、Shutdown 块(PLC 停止时)、Interrput.c 中发生数字输入中断时以及 Fulmatic.c 中发生基于时间(定时器)的中断时被调用。

Fulmatic.c

代码中所需的所有库函数都集中在 Fulmatic.c 文件中。该文件会跳转到其他文件。我们将这些函数分为四个类别。函数的描述写在函数体所在的文件中。

  • 示例项目所需的但库中未使用的函数。
  • 库中使用的、必须包含在您的代码中的函数。
  • 库中用于许可目的的函数。未获得许可的使用不需要这些函数。
  • 库的功能取决于所使用的PLC指令。例如,如果您的PLC未使用TCP、UDP、SPI、串口和SD卡等操作,则该库在没有这些功能的情况下也能正常工作。

_DefaultEprom:可通过 Fulmatic SOFT 选择的硬件设置存储在 PlcSetupEprom[STPMEMORYSIZE] 和梯形图代码数组 PlcEprom[PRGMEMORYSIZE] 中。此文件中的 _DefaultEprom 函数包含 PLC 的默认设置。您可以通过在代码中使用这些数组来在一定程度上自定义配置。

`_EachMilliSecond`:此函数每毫秒运行一次,在主文件和库中均会执行。在示例项目中,标志位是通过 `Interrupt.c` 中的 `TIM7_IRQHandler` 函数设置的,而不是直接执行。此外,`TIM7->ARR` 值已使用 RTC 进行校准。请查看 `Fulmatic.c` 中的 `_RtcCalibration` 函数。校准不正确会导致 PLC 中所有基于时间的操作出现轻微误差。

_DelayUs:您可能需要修改代码,以确保其设置与芯片频率完全匹配。您应该进行长时间的测试和校准。它已针对 168 MHz 频率进行了校准。

_SetOutputs:通常情况下,输入在 main.c 中读取,输出在 main.c 中写入。但是,当发生基于时间或数字的输入中断时,OB2 中断块会被触发。然后,库内部会调用该中断块来立即设置输出。

_GetMsTimerCount 用于测量多种操作的持续时间。您的代码中必须包含此函数。您需要启用对毫秒级计时器值的读取。

_CrcCalculate:用于使用硬件计算校验和。您必须确保它能根据您使用的芯片正常工作。

沟通.c

此文件包含在 PLC 中使用以太网、串口和 SPI 所需的必要代码。来自 Modbus 和 Fulmatic SOFT 的调用均在此文件中接收。通过在 main.c 中设置延迟来确保数据一致性。此外,固件更新和 SD 卡操作的代码也明确地写在此文件中。Fulmatic SOFT 使用此代码执行固件更新和 SD 卡操作。您可以修改此代码,以便使用您自己的软件(而非 Fulmatic SOFT)执行类似的操作。其他 Fulmatic SOFT 操作和 Modbus 操作均通过此代码发送到库并由库响应。通过修改代码,您还可以直接响应 Modbus 调用,而无需将其发送到库。

Flash.c

PLC断电时,其代码和持久定时器/计数器信息会被保存到闪存中。PLC再次上电时,会从 flash.h 文件中读取上次保存的代码。请记住设置您所用芯片的扇区信息。您可以使用以下电路来检测PLC何时断电。

当电压从 24 伏降至约 19 伏时,该电路会将关断检测引脚置低。电容 C1 允许芯片在短时间内继续工作。在此期间,擦除和重写闪存数据存在风险。因此,必须遵循以下步骤。

  • PLC首次上电时,我们将扇区10复制到扇区11。如果在启动过程中断电,则完整数据存储在扇区11中。
  • 要将新数据保存到闪存,首先需要删除现有数据。删除操作比保存操作耗时更长。因此,我们在启动时删除第 10 扇区,然后等待关机。
  • 关机检测电路提供略多于 1 秒的响应时间。检测到关机后,数据会在 100-200 毫秒内保存到扇区 10。由于 OB 1 关机模块会在关机之前运行,并且 PLC 中可能存在较长的梯形图代码,因此 C1 电容的容量应至少为 2200 µF。使用 100 欧姆的限流电阻是为了防止大电容对电路造成冲击。
  • PLC启动时,会读取扇区10中的所有数据并进行校验和检查。如果在PLC启动过程中断电,校验和检查将会失败。不必担心,扇区11始终存储着可靠的数据。PLC的启动过程会自动从扇区11开始。

中断.c

数字输入、ADC、定时器和UART中断都位于此文件中。它们根据PLC的运行模式在Fulmatic.c文件中的_INTSetup函数中启用或禁用。请务必根据您的硬件调整_INTSetup代码。此文件中的函数需要快速运行。在我们的示例代码中,我们使用了switch命令来提高代码的可读性。但是,还有其他方法可以提高运行速度。例如,可以将switch命令中的操作编写成单独的函数。

  • void Handle_Encoder(void)
  • void (*EXTI0_Handler_Ptr)(void);
  • 根据在 INTSetup 中使用 Fulmatic SOFT 所做的选择:EXTI0_Handler_Ptr = Handle_Encoder;
  • 当发生中断时:在 EXTI0_IRQHandler 内部运行 EXTI0_Handler_Ptr()。

另一种加速方法是字节到 32 位转换。您可以使用以下代码来处理 STM 系列:*(int32_t *)&PlcIO[EncIAdr[0]] = __rev(ValueS32);

我们不应该使用 HAL 库来清除中断标志。相反,我们应该优先选择直接修改寄存器值这种更快的方法。TIM3->SR = 0; //__HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);

数字输入中断:用于高速计数器、编码器和类似应用。

ADC:我们不使用DMA;我们在中断内执行ADC读取操作。这使我们能够执行滤波操作。

定时器:我们将其用作一毫秒定时器和PTO输出。定时器不仅要每毫秒中断一次,还必须从0计数到999。

USART:串口中断用于数据传输和接收。此外,Fulmatic.c -> _EachMilliSecond 包含 RS485 使能引脚操作。

SD卡.c

SD卡操作在此文件中执行。您也可以采用与示例项目不同的方式。用于向PLC上传或下载文件的通信代码以开源形式编写在Communication.c文件中。您可以使用Fulmatic SOFT软件进行文件上传和下载。如果您的项目没有SD卡,则可以删除所有相关功能。

主文件

每次使用 Cube MX 保存项目时,此文件都会更改。为确保您的命令保持不变,您必须在 Cube MX 中预留的代码区域编写代码。/* 用户代码开始 2 */ 在此处编写您的代码。/* 用户代码结束 2 */

您可以在此文件中创建库所需的所有变量。您可能需要在特定地址创建大型数组。`uint8_t PlcEprom[PRGMEMORYSIZE] __attribute__((section(“.ccmram”))));`

仔细检查 while 循环内部的操作。任何修改都不应破坏循环的整体结构。程序其他部分的代码也不应减慢此循环的执行速度。