|
arima 发表于 2026-8-17 22:35 几十年前的一个开源项目,去搜索一下 EasyPLC之类的, ![]() |
easyPLC.JPG (32.65 KB, 下载次数: 0)
| 楼主真的用心了,很详细的说明,谢谢分享。 |
wkman 发表于 2026-7-6 16:19 直接套那个开源的仿三菱,在哪可以套? |
|
高速脉冲输出 控制脉冲输出有5种方法。 以Y100为例: 输出方向选择:DIR(Y100,方向)。方向为0表示反转,为1表示正转。 获取输出方向选择:DIR_Get(Y100)。返回0表示反转,1表示正转。 输出控制:PLSY(Y100,频率,脉冲个数)。频率范围为20Hz~10KHz。脉冲个数为0时表示持续输出。返回0表示正常,PLSY_ERR_CH表示通道错误,PLSY_ERR_FRE表示频率错误,PLSY_ERR_BUSY表示通道已工作。指令执行后,半个周期后开始输出脉冲,占空比固定50%。 判断状态:PLSY_IsBusy(Y100)。1表示正工作,0表示空闲。 停止输出:PLSY_Stop(Y100)。无返回值。 注:同一个Y10x,高速PWM输出和高速脉冲输出只能选一个使用。 |
直接套那个开源的仿三菱,更成熟 省事啊。 |
| 请问代码是完整可以提供学习参考的吗? |
| PLC编程软件用的什么的? |
| 谢谢分享了学习一下 |
qsssuv 发表于 2026-3-3 17:33 nb,很想自己做个PLC |
|
本 log 函数是针对 MCU-PLC 硬件场景定制的日志输出函数。 /******************************** 功能描述:打印到控制台(串口输出) 参数说明:*format:格式控制。支持以下格式: %d:s16数据 %u:u16数据 %ld:s32数据 %lu:u32数据 %s:字符串 %c:ASCII字符 %X:u16数据的16进制字符串 %lX:u32数据的16进制字符串 %[0][1-5]u:以n的宽度显示u16数据,不足时可前置添0,超过时宽度限制无效 %[0][1-10]lu:以n的宽度显示u32数据,不足时可前置添0,超过时宽度限制无效 %.[0-4]d:对s16数据以小数形式呈现 %.[0-9]ld:对s32数据以小数形式呈现 %.[0-4]u:对u16数据以小数形式呈现 %.[0-9]lu:对u32数据以小数形式呈现 %.nd:参数1为保留小数位数,参数为2为s16数据 %.nld:参数1为保留小数位数,参数为2为s32数据 %.nu:参数1为保留小数位数,参数为2为u16数据 %.nlu:参数1为保留小数位数,参数为2为u32数据 %t:参数1为字符串指针。参数2为限制长度,可以是参数1的空间大小-1。将此字符之前的格式化的字符复制到第1个字符串指针位置 %hs:参数1为u8指针。参数2为限制长度。将此数据转为十六进制字符串。 %hn:参数1为u8指针。参数2为限制长度。直接拷贝源数据。 返回值:指向数据缓冲区的指针,除%t参数外,其它功能都会使得该数据区以字符串结束符结束(\0) ********************************/ char *log(char *format, ...); 例如,将AI0打印至窗口
受限MCU的资源,打印多个参数时,可能输出异常,可以分解进行单个打印。 |
|
【Modbus-RTU从站协议】 通信配置:4800,N,8,1。访问地址固定为1。 寄存器表就不贴图了,可以下载下来看设计说明中的详细内容。 总之,就是直接连上Modscan工具就可以使用,很方便。 在仿真上,你需要安装虚拟串口驱动,才能使用modscan连接到proteus仿真 在app_plc_reg_update文件中,填写了默认的更新事件内容,用户可自定义其它行为 |
|
【日期和时间】 dhms是一个集合了设备已运行时间的对象。包含天数、时、分、秒。 dhms.day,天,最大到32767。 dhms.hour,时。 dhms.min,分。 dhms.sec,秒。 用户可将其加载至通用数据寄存器。 |
|
本帖最后由 qsssuv 于 2026-3-11 08:21 编辑 【高速计数输入】 需要用到特殊辅助继电器、特殊数据寄存器,这里使用了一看就明白的变量值。 使能高速计数输入X0,注意使能后,请勿将其用作通用输入接口:
需要注意,受限于MCU的性能,若值范围为0~255,则计数的设置上限,以及起始计数值,设置时均不可超出此范围。 若需要使用高速计数输入X3,将以上代码中的X0修改为X3使用即可。 |
gongzhu 发表于 2026-3-8 10:30 PCB可以用STC32,但是仿真上没有,所以用了STC15,其实任何单片机都可以 |
| 要做PLC起码也得用STC32吧 |
|
【高速输出/PWM】 控制高速输出有4种方法。分别为以下: 以Y100为例。 输出控制:PWM_OUT(Y100,频率,占空比)。频率范围为400Hz~100KHz,占空比范围为0-100,为整数,请勿使用小数。占空比0=无输出,100=持续高电平。 获取输出频率:PWM_GetFre(Y100)。返回设置的频率,若未设置,返回0。 获取输出占空比:PWM_GetDuty(Y100)。返回设置的占空比,若未设置,返回255。 停止输出:PWM_STOP(Y100)。Y100将为0。 注:若不进行高速输出,其默认将为一个通用输出。 |
|
【计数器】 计数器有3种状态,分别是停止(C_STA_STOP)、运行(C_STA_RUN)、计数到达(C_STA_OK)。 16位通用加计数器有2种方法。 第1种方法,加计数:CTU(要使用的计数器,信号源,计数目标值)。 例如使用计数器C0对X0的上升沿,进行加计数,到达10次时,Y0输出1s后重新开始计数。
第2种方法,减计数:CTD(要使用的计数器,信号源,计数目标值)。 例如使用计数器C1对X1的下降沿,进行减计数,到达10次时,Y1输出2s后重新开始计数。
32位通用计数器有1种方法。CTUD(计数器,加计数信号源,减计数信号源,计数目标值)。 例如使用计数器C200,X0作为加计数信号源,X1作为减计数信号源,当数值到达200时,Y0输出2s,然后重新计数。 由于32位通用计数器在计数完成后,仍会受到加减操作的影响,导致状态变更,因此引入辅助继电器,避免Y0的输出波动。
|
|
【定时器】 所有的定时器,都是倒计时定时器,将从设置的值开始倒计时,若计数值达到0,运行状态T_STA_RUN,将转变为计时到达状态T_STA_OK。 定时器有4种状态、5种使用方法。 4种状态分别是:停止(T_STA_STOP)、运行(T_STA_RUN)、暂停(T_STA_PAUSE)、计时到达(T_STA_OK)。 5种使用方法分别是TON、TPAUSE、TRST、TGetSta、TGetVal,用以下例子加以说明。 //若T0定时10ms时间到,则输出Y0。 IF (TON(T0,10)==T_STA_OK) { SET(Y0); } ELSE { RST(Y0); } //时间未到时,若X0输入,则暂停定时器,若X1输入,则重置定时器 IF (TGetSta(T0)!=T_STA_OK) { IF (X0) TPAUSE(T0); IF (X1) TRST(T0); } //将计数值导出到D0 D0 = TGetVal(T0); 注意,定时器定时值的单位为对应时基:如1ms定时器T0,TON(T0,10)表示定时10ms;100ms定时器T100,TON(T100,5)表示定时500ms,以此类推。 |
cccc888 发表于 2026-3-5 17:31 这个LIB没有使用限制,但是只在仿真中测试通过 |
|
plc相关提供一个外部头文件,而不是在几个头文件中 mcu plc。lib中有没有使用时间限制。 |
|
本帖最后由 qsssuv 于 2026-3-11 08:20 编辑 【模拟量输入】 直接读取值即可: D0=AI0; |
提议降分, 代码不全, 功能关键代码缺失![]() |
| 感谢楼主,下载学习一下。51做PLC仅供学习原理应该是没什么问题的 |
|
本帖最后由 qsssuv 于 2026-3-11 08:20 编辑 【通用输入/通用输出操作】 X为输入,Y为输出。 读取输入,直接写名称即可。
|
| 这里放上proteus的仿真(需要8.15版本)、工程(内含设计说明书)。 |
21.79 KB, 下载次数: 0, 下载积分: 黑币 -5
562.76 KB, 下载次数: 0, 下载积分: 黑币 -5