尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
C#实现松下PLC Mewtocol-COM串口通讯与BCC校验DEMO
简介面向C#工控上位机开发者与电气自动化学习者的松下PLC串口通讯DEMO采用Mewtocol-COM协议并经过实测验证重点解决上位机通过COM口读写PLC触点与数据寄存器的基础通讯问题。工程完整包含单个触点RCS读取、WCS写入单个数据寄存器RD读取、WD写入以及字单位触点RCC读取如Y0—YF、R0—RF和多寄存器连续读写等功能适合用作协议帧拼装、串口收发、地址解析与联机调试的参考样例。压缩包共36个文件约119KB以C#源码为主配有解决方案与项目工程文件、应用配置、资源文件及可执行程序结构轻量便于直接打开运行和二次改造。已有1089人学习下载读者可据此对照Mewtocol命令格式理解请求与响应报文掌握触点与寄存器地址映射、读写校验和异常排查思路快速搭建自己的PLC串口通讯模块。1. 串口助手能通、代码不通问题从来不在那根线现场最常见的画面笔记本插着 USB 转 232串口助手敲进%01#RDD00000001松下 PLC 回了东西看着挺美换成 C# 上位机同一根线同一个口发出去石沉大海。问题不在线在帧。Mewtocol-COM 是松下 PLC 原生支持的串口协议帧头、站号、指令、数据区、地址、点数、BCC 校验一个都不能少串口助手替你补的那些东西代码不会替你补。这份 DEMO 干的就是把这件事拆开摆平在 C# 里拼 Mewtocol-COM 帧、算 BCC、一发一收解析响应把 DT 数据寄存器和继电器状态读上来、写下去。适合做产线采集、配方下发、老设备改造的上位机开发者设备已经走 OPC 或现成驱动的这套东西用不上。下面按帧结构、串口层、跑通路线、踩坑顺序拆。2. 拆 Mewtocol-COM 帧从%到 CR 的每一个字节都有归属2.1 请求帧与响应帧的字段对照Mewtocol-COM 是 ASCII 文本协议一帧从头到尾都是可读字符这一点对现场调试极其友好不用凑二进制串口助手直接敲就能试。请求帧以%0x25开头以 CR0x0D结尾中间的字段全部定长、十进制补零少一位 PLC 就直接甩一个错误码回来不会给你任何容错空间。段长度示例说明帧头1%固定ASCII 0x25站号201PLC 侧设定的站号单机默认 01分隔符1#表示这是一个请求指令2RD/WD/RCS/WCS读数据 / 写数据 / 读触点 / 写触点数据区1~2D/X/Y/R/L/T/CDT 数据寄存器对应的是D地址500100十进制、左补零地址语义是「第几个字」不是「第几个字节」点数40001本次读写的字数或触点数BCC264前面所有字符异或后的低 8 位两位十六进制大写结束1CR0x0D不能用 LF 代替响应帧的骨架比请求帧更短% 站号 $或! 指令回显 数据 BCC CR。$表示正常执行!表示异常!后面紧跟两位错误码BCC 在最后两位CR 收尾。举个例子站号 01 读 DT100 一个点成功返回的帧体形如%01$RD0064其中0064就是 DT100 里的值十六进制表示占 4 位。读触点的响应格式跟读数据不一样这点 DEMO 里必须分开处理RCS的响应数据段是一串连续的0和1第 n 个字符对应从起始地址起的第 n 个触点不是 4 位一组。如果拿读 DT 的解析逻辑去套读 X/Y解析出来的值会张冠李戴而且不会报错属于典型的静默错。提示地址字段的位数跟机型有关。FP0、FP-X、FP-XH 这一代用 5 位地址配 4 位点数更老的 FP1 系列部分机型是 4 位地址。接机型前先确认手册里那一页的帧示例长度别拿着 5 位格式去怼 4 位机型BCC 会一直报错你还以为是自己算错了。2.2 BCC 的计算范围为什么必须从%开始BCC 是这一整套协议里最容易翻车的地方因为它不像 CRC 那样有标准库现成可调只能手算。规则本身不复杂把帧体里除 BCC 两位和 CR 之外的每一个字符取 ASCII 码逐字节异或结果取低 8 位转成两位大写十六进制。// body 是从 % 开始、到点数最后一位结束的帧体不含 BCC 和 CR private static byte CalcBcc(string body) { byte bcc 0; foreach (char c in body) { // 取字符的 ASCII 码参与异或不是 char 本身做算术 bcc ^ (byte)c; } return bcc; }参数说明body必须以%开头这一点是硬要求把%漏掉是最常见的错误来源末尾字符是点数的最后一位不能再往后带 CR返回值用ToString(X2)转成大写两位十六进制拼到帧尾。DEMO 里如果封装的是一个「传帧体、返回完整帧」的方法那 CR 的拼装和 BCC 的计算必须在同一个方法里完成分开写迟早会有人传错。手算一遍有助于建立直觉。帧体%01#RDD000000001%01#RDD 地址00000 点数0001逐字符异或0x25 ^ 0x30 0x15^ 0x31 0x24^ 0x23 0x07^ 0x52 0x55^ 0x44 0x11^ 0x44 0x55接下来 8 个00x30是偶数个异或结果不变仍然是0x55最后^ 0x31 0x64。所以 BCC 是64整帧就是%01#RDD00000000164加一个 CR。找张纸把这段算一遍比看十遍代码管用。为什么 BCC 不用 CRC这套协议诞生年代早跑在 9600 的线上校验能力够用即可异或的实现成本低到单片机都能随手算出来对 PLC 侧的实时性影响最小。反过来说异或校验对两位同时翻转的错误是查不出来的所以现场不要指望它兜住线路干扰屏蔽双绞、单点接地这些基本功该做还得做。2.3 响应里的$和!是两种命运$之后的处理是机械的按指令类型切数据段每 4 位一组转十六进制。!之后的处理才是真正需要经验的部分错误码直接告诉你 PLC 为什么拒绝你读懂能省掉半天排查。错误码含义现场最常见的触发原因21数据区代码或地址异常区代码写错把 DT 当成了 DM或地址超过该机型实际点数22点数异常一次请求的点数超过协议上限或写了 000023数据范围异常写入值超过 16 位无符号范围或 BCD 模式下写了非法数字24指令无法执行PLC 处于 PROG 模式、被编程口占用或该区只读26指令不存在指令拼错比如把RD敲成DR30BCC 校验错误异或范围错漏了%或把 CR 算进去了50 / 51发送 / 接收超时帧不完整、结束符不是 CR、波特率对不上不同机型的手册里错误码表会有细微差异手上的那本手册才是最终解释权。DEMO 里我把错误码封装成一个自定义异常抛出时带上原始响应帧这样日志里能看到现场那一刻到底收到了什么不用靠猜。选型上还有个问题值得说清楚为什么不用 Modbus。松下 FP 系列原生就跑 Mewtocol不需要额外通讯模块也不需要买授权Modbus 要么加扩展卡要么依赖某些机型的内置支持。为什么不去 NuGet 上找现成库能搜到的多数是面向 FP7 的以太网 Mewtocol走 232 文本帧的很少而且大多几年没更新。协议本身只有两三百行的工作量手写一遍换来完全可控的排错能力这笔账我认为划算。3. C# 串口层落地参数、拼帧、收帧与事务封装3.1 上位机串口参数和 PLC 侧系统寄存器必须对齐这一步对不上后面所有代码都是白写。松下 FP 系列的 COM1 口参数由 PLC 侧的系统寄存器决定改完之后一般需要断电重启或者 RUN→PROG→RUN 切一次才生效很多人改完参数直接在软件里试试不通就以为是代码问题。参数PLC 侧COM1C# 侧 SerialPort波特率9600出厂常见BaudRate 9600数据位8DataBits 8校验奇校验 OddParity Parity.Odd停止位1StopBits StopBits.One流控无Handshake Handshake.None站号1默认帧内%01奇校验这一项坑过太多人串口助手新建连接时默认是无校验你在助手里发的帧 PLC 能收到回的帧你这边全是乱码于是得出「PLC 没回」的错误结论。实际上回了只是校验位不匹配导致的字节错位。新建任何串口连接先把 Odd 点上。硬件侧还有两件事值得在代码之前确认USB 转 232 的芯片型号CH340、FT232、PL2303 驱动各不相同装好驱动后在设备管理器里确认端口号不要每次靠猜以及 232 是交叉接线2-3、3-2、5-5直连线的现象是「发得出去、收不回来」跟 BCC 错的症状一模一样很容易误判。3.2 拼帧定长格式化和 BCC 必须在同一个方法里拼帧的核心是「所有数字字段定长补零」用字符串插值里的格式化占位符是最省事的写法比PadLeft一串调用可读性好得多。public static class MewtocolFrame { // 读数据区area 传 D 读 DTR 读内部继电器字 public static string BuildRead(byte station, string area, int address, int count) { // 站号 2 位、地址 5 位、点数 4 位全部补零到位 string body $%{station:D2}#RD{area}{address:D5}{count:D4}; byte bcc CalcBcc(body); return body bcc.ToString(X2) \r; } // 写数据区values 每个元素占 4 位十六进制 public static string BuildWrite(byte station, string area, int address, params ushort[] values) { var sb new StringBuilder(); sb.Append($%{station:D2}#WD{area}{address:D5}{values.Length:D4}); foreach (ushort v in values) sb.Append(v.ToString(X4)); // 一个字固定 4 位不能省前导零 string body sb.ToString(); byte bcc CalcBcc(body); return body bcc.ToString(X2) \r; } private static byte CalcBcc(string body) { byte bcc 0; foreach (char c in body) bcc ^ (byte)c; return bcc; } }逐个参数说明station是 PLC 侧设定的站号单机默认 1多站 485 组网时每台不同area是区代码读 DT 传D读内部继电器传R读输入输出传X和Y传错不会有编译错误只会在运行时收到错误码 21address是起始地址注意它是字地址DT100 就传 100不要乘 2count是点数DEMO 里我限制在 1~64理由在 3.3 节讲。写帧里v.ToString(X4)这一句不能偷懒写成ToString(X)。省掉前导零后值0x0005会变成5帧长度少三位PLC 收到的是一个点数对不上长度的畸形帧返回错误码 50 或者干脆不回。这类问题在代码 review 时极难发现因为写 0x1234 的时候一切正常只有小数值才暴露。3.3 收帧ReadTo(\r)好用但有三个前提SerialPort 的读取方式有好几种ReadExisting会把缓冲区里现有的一切都吐给你可能是半帧可能是两帧粘在一起自己拼状态机成本不低。ReadTo(\r)是文本协议下的正确选择它以 CR 为界返回一整个帧体但它成立有三个前提缺一个就会翻车。第一个前提是NewLine和协议结束符一致。ReadTo的分隔符是显式传参跟NewLine无关但如果代码里混用了ReadLine就必须把NewLine设成\r默认是\r\n会一直等到超时。第二个前提是超时时间要合理。9600 波特率下一个字符大约 1ms一帧 20 来个字符加上 PLC 的扫描周期500ms 是宽松值。设成 50ms 会在 PLC 忙的时候频繁超时设成 5000ms 会让界面卡到用户以为死机。第三个前提是超时之后必须清缓冲。ReadTo抛TimeoutException时缓冲区里往往残留着半帧下一帧到来后会跟这半帧拼在一起产生一个 BCC 永远对不上的怪帧。所以每次事务开始前DiscardInBuffer()超时后也要清这是用血泪换来的习惯。注意一次请求一次响应中间不要插别的读写。串口是独占资源两个线程同时往同一个 SerialPort 写帧会交错PLC 收到的是两帧揉在一起的乱码。多线程场景下必须用锁或者信号量把整个事务串起来。3.4 把收发封装成一次事务把拼帧、发送、收帧、BCC 校验、异常识别收进一个Transact方法上层调用者只需要关心「读哪个地址、读几个」这是 DEMO 结构上最值得保留的部分。public sealed class MewtocolClient : IDisposable { private readonly SerialPort _port; private readonly object _gate new object(); // 事务级互斥 private readonly byte _station; public MewtocolClient(string portName, byte station 1, int baudRate 9600) { _station station; _port new SerialPort(portName, baudRate, Parity.Odd, 8, StopBits.One) { ReadTimeout 600, WriteTimeout 600, NewLine \r, Encoding Encoding.ASCII }; } public bool IsOpen _port.IsOpen; public void Open() { if (!_port.IsOpen) _port.Open(); } private string Transact(string body) { lock (_gate) { byte bcc 0; foreach (char c in body) bcc ^ (byte)c; string frame body bcc.ToString(X2) \r; _port.DiscardInBuffer(); // 清掉上一轮残留防半帧拼接 _port.Write(frame); string resp _port.ReadTo(\r); // 不含 CR含末尾两位 BCC if (resp.Length 5) throw new IOException(响应过短 resp); string payload resp.Substring(0, resp.Length - 2); string recvBcc resp.Substring(resp.Length - 2); byte calc 0; foreach (char c in payload) calc ^ (byte)c; if (!string.Equals(calc.ToString(X2), recvBcc, StringComparison.OrdinalIgnoreCase)) throw new IOException(BCC 不匹配原始响应 resp); if (resp[3] !) throw new MewtocolException(resp.Substring(4, 2), resp); return resp; } } public ushort[] ReadDT(int address, int count) { if (count 1 || count 64) throw new ArgumentOutOfRangeException(nameof(count)); string resp Transact($%{_station:D2}#RDD{address:D5}{count:D4}); string head $%{_station:D2}$RD; if (!resp.StartsWith(head, StringComparison.Ordinal)) throw new IOException(非预期响应 resp); string data resp.Substring(head.Length, resp.Length - head.Length - 2); var values new ushort[count]; for (int i 0; i count; i) values[i] Convert.ToUInt16(data.Substring(i * 4, 4), 16); return values; } public void Dispose() { if (_port.IsOpen) _port.Close(); _port.Dispose(); } }几个设计点值得解释。lock (_gate)锁的是整个收发过程而不是只锁写因为请求和响应是一对一的只锁写会让两个线程的响应互相串台。resp[3] !这个判断依赖帧头固定为% 两位站号索引 3 一定是状态位站号超过两位的协议变体不适用。BCC 校验放在错误码判断之前因为一个 BCC 错的帧里读出来的错误码本身也不可信。ReadDT里把点数限制在 64不是因为协议不支持更多而是 9600 波特率下响应帧过长时PLC 侧的发送缓冲和上位机的接收超时都容易出问题实测 32 点左右最稳。要读 100 个 DT就分四次读代码里多一个循环现场少一堆偶发超时。4. DEMO 跑通路线从上电到读到 DT 值的四步验证4.1 先别接 PLC用回环确认线路和驱动拿到任何一套串口通讯 DEMO我的习惯都是先不接设备把 USB 转 232 的 2、3 脚短接做回环。发什么收什么说明驱动、端口号、串口参数这一整条链路是通的。这一步花两分钟能排除后面一半的怀疑对象。具体做法设备管理器里记下端口号比如 COM3串口助手打开 COM39600、8、Odd、1对回环也用 Odd保持和后面一致发送区输入ABC点发送接收区应该立刻显示ABC。收不到就是驱动或者线的问题跟 PLC 一点关系都没有。回环通了之后接 PLC仍然先用串口助手发一帧不要急着写代码。发送框里敲%01#RDD00000000164记得勾选「发送新行」并且确认新行是 CR 而不是 CRLF然后观察返回。收到%01$RD开头的帧说明接线、参数、站号、帧格式、BCC 全对可以开始写代码了收到%01!30就是 BCC 算错收到%01!21是区代码或地址不对。4.2 单点读 DT一帧请求一帧响应单点读写是最小可验证单元先把 DT100 读上来再去谈批量。using (var plc new MewtocolClient(COM3, station: 1, baudRate: 9600)) { plc.Open(); ushort[] v plc.ReadDT(100, 1); // 读 DT100 开始 1 个字 Console.WriteLine($DT100 {v[0]} (0x{v[0]:X4})); }执行逻辑构造帧体%01#RDD001000001算 BCC 拼上 CR 发出等待响应校验 BCC确认响应头是%01$RD从第 7 个字符起每 4 位切一组转十六进制。如果 DT100 里存的是十进制 100你看到的会是DT100 100 (0x0064)。这一步跑通说明协议层和串口层都没问题剩下的都是工程量。写入的验证方式要注意写完立刻回读。写 DT100 值为 1234然后读回来确认是 1234而不是看 PLC 编程软件的监控画面——监控画面有刷新延迟你看到的可能是写入前的值白高兴一场。plc.WriteDT(100, 1234); // 写 DT100 ushort back plc.ReadDT(100, 1)[0]; // 立刻回读校验 if (back ! 1234) throw new IOException($回读不一致{back});4.3 批量读写与地址映射表DEMO 里最容易被忽略的是地址映射。上位机界面上写的是「1 号工位温度」实际对应 DT200这个对应关系必须有一张表而且这张表要跟 PLC 程序里的注释对得上。我一般会把它做成配置而不是硬编码改地址不用重编译。用途区代码起始地址示例点数数据类型工艺参数D100816 位无符号实时数据D2003216 位无符号内部继电器状态R016位电机运行反馈X08位只读输出控制Y08位批量读的写法和单点一样只是把点数改大解析时循环切 4 位。需要注意的是跨区读写不要放在同一帧里协议不支持一个区代码一帧。4.4 WinForms 界面和后台轮询的边界DEMO 如果带界面最容易踩的坑就是把串口 IO 放在 UI 线程。ReadTo在超时期间是阻塞的600ms 的超时意味着界面卡 600ms用户拖动窗口会拖出残影连续几次超时就变成「程序未响应」。正确做法是后台线程或Task里跑轮询拿到数据后用Invoke或BeginInvoke回 UI 线程更新控件。Invoke是同步的会阻塞后台线程等 UI 处理完轮询频率高的时候会拖慢整个循环BeginInvoke是异步投递更适合这种「取到数据就扔给界面」的场景。private async Task PollAsync(CancellationToken ct) { while (!ct.IsCancellationRequested) { try { ushort[] data _plc.ReadDT(200, 32); // 后台线程读不碰控件 BeginInvoke(new Action(() UpdateGrid(data))); // 回 UI 更新 } catch (TimeoutException) { BeginInvoke(new Action(() SetStatus(通讯超时))); } await Task.Delay(200, ct); // 轮询间隔别小于 PLC 扫描周期 } }轮询间隔设 200ms 是个经验值比这更密在 9600 波特率下意义不大一帧 20 字符来回加上 PLC 处理本来就要几十毫秒再快只是把请求堆在缓冲区里。5. 避坑与排查五个现场血泪记录5.1 发出去收不到串口助手却一切正常现象代码里Write不抛异常ReadTo每次都在 600ms 后抛TimeoutException同一台机器用串口助手发一模一样的字符串PLC 回得好好的。原因九成是串口参数不一致尤其是校验位。串口助手默认新建连接是 None你自己手动改成 Odd 了代码里却写成了Parity.None或者是数据位写成了 7。参数不一致时 PLC 能收接收对校验不敏感的部分机型但它回帧的校验位对你来说是错位的接收缓冲里全是垃圾字节ReadTo等不到 CR。解决把上位机侧的波特率、数据位、校验、停止位、流控五项和 PLC 系统寄存器里的设置逐项对一遍特别注意改完 PLC 参数要断电重启或者 RUN→PROG→RUN。另外把Handshake显式设成None默认值在某些 USB 转串口驱动上表现不一致。5.2 BCC 一直报 30手算却是对的现象代码拼出来的帧发给 PLC稳定返回%01!30拿计算器按一遍 BCC 又跟代码算的一样。原因多半是 CR 被算进去了或者用了\r\n。ReadTo(\r)场景下如果拼帧时写成body bcc \r\nPLC 收到 CR 之后还会多看到一个 LF某些固件会把它算进下一帧的起始导致 BCC 校验失败或者帧错位。另一个可能是大小写协议要求 BCC 是两位大写十六进制某些机型对a和A的容忍度不一样。解决拼帧用\r不用\r\nBCC 输出固定ToString(X2)调试时把最终发出的完整帧用Encoding.ASCII.GetBytes打出来看字节0D 后面不该有 0A。这个小技巧我一般会写进日志出问题时一眼就能看出多没多字节。5.3 读 DT 读到的是隔壁地址的值现象读 DT100返回的值跟 PLC 编程软件监控里 DT100 的值对不上但跟 DT101 或者 DT102 能对上。原因地址位数或者地址语义搞错了。有的开发者按字节地址思维把 DT100 传成 200有的是 4 位地址机型和 5 位地址机型混用{address:D5}把 100 补成00100PLC 期望的是0100多出来的一位把后面的点数位挤掉PLC 解析出的是另一个地址。解决先确认机型对应的地址字段长度用串口助手发一帧看响应是否正常再确认地址是字地址不是字节地址。DEMO 里把地址格式化的位数做成可配置的常量换机型只改一处别散落在各个方法里。5.4 跑十几分钟后必现超时重启软件就好现象刚启动时通讯正常跑十几分钟开始偶发超时越来越频繁最后完全不通关掉软件重开又好了。原因异常路径没有清缓冲。每次超时后缓冲区里残留半帧下一帧的响应接在这半帧后面ReadTo读到的第一个 CR 是那个残帧的解析出来 BCC 对不上抛异常再残留雪球越滚越大。另一个可能是SerialPort没关就重新Open端口句柄泄漏。解决事务开始前和超时后都调DiscardInBuffer()把SerialPort的Close/Dispose放进using或finally界面上提供一个「重连」按钮内部实现是Close后延时 500ms 再Open别在原地反复Open。5.5 两个窗体同时开报端口被占用现象主界面已经在轮询点开一个参数设置窗体设置窗体也去new SerialPort(COM3)抛UnauthorizedAccessException。原因串口是独占资源同一进程里两个SerialPort实例指向同一个物理口也会冲突。解决整个应用只维护一个MewtocolClient实例通过构造函数或者静态属性传给各个窗体如果窗体之间是松耦合的就套一层单例的服务类所有读写请求排队进同一个事务锁。这属于架构问题不是串口问题但表现出来的现象特别像串口问题值得单独记一笔。6. 把 DEMO 改成能上产的通讯层轮询表、重连和日志DEMO 能跑通和能上产线之间差的不是协议知识是三样东西一张配置化的轮询表、一套断线自愈的重连逻辑、一份能复盘的黑匣子日志。这三样我在每个项目里都会补缺一样后面都要还债。轮询表用配置驱动把「读哪个区、起始地址、点数、周期、超时、失败重试次数」写本文还有配套的精品资源点击获取
RELATED

相关推荐

基于张量核范数与ADMM的彩色图像去噪MATLAB实现

基于张量核范数与ADMM的彩色图像去噪MATLAB实现

简介:这份开源工具面向研究张量分解、高维数据恢复与去噪的Matlab用户,重点以凸优化框架实现低秩张量近似,可用于图像、视频及多模态数据的噪声抑制与信号重建。压缩包共48个文件,以45个.m函数脚本为主体,辅以1个Markd…

📅 2026/10/26 13:42:13
GLM-5.2深度解析:国产长程工程模型的架构突破与落地实践

GLM-5.2深度解析:国产长程工程模型的架构突破与落地实践

1. 项目概述:这不是又一个“参数堆砌”的大模型,而是一次面向真实工程场景的架构重思考“GLM-5.2深度拆解:百万上下文自研架构,国产长程工程模型突围”——这个标题里没有“最强”“登顶”“碾压”这类营销话术,但每一…

📅 2026/10/26 13:42:13
AI训练数据主权:技术规范与合规架构解析

AI训练数据主权:技术规范与合规架构解析

1. 项目背景与核心概念解析 2023年全球AI大模型研发竞赛进入白热化阶段,训练数据作为模型性能的决定性因素,其获取与使用正面临前所未有的主权争议。这份公约的提出,标志着AI产业从单纯的技术竞争转向数据治理规则的制定权争夺。 训练语料结…

📅 2026/10/26 13:37:12
MORE NEWS

更多资讯

📰

AI语料困境与大模型发展的突破路径

1. 语料困境下的AI发展现状 当我在2023年清理服务器上的训练数据时,突然意识到一个严峻的事实:我们可能已经收集了互联网上90%以上的可用高质量文本数据。这个发现让我开始重新思考大模型发展的根本性问题——在语料资源接近枯竭的今天,人工智…

📰

AI辅助迁移Compose项目:从RecyclerView到LazyColumn的工程实践

1. 为什么“迁移 Compose 项目”这件事让 Android 开发者集体头疼 做过几年 Android 的人应该都有体会:一个跑了三五年的老项目,里面塞满了 Java、Kotlin、XML 布局、自定义 View、第三方库,突然要往 Jetpack Compose 上迁,第一反…

📰

AI编程安全翻车实录:SQL注入、审计后门与多AI协作泄露

1. 当AI开始替你改代码,风险才真正开始用Cursor补全一个函数、让AI Agent自动修一个报错、把一段祖传代码丢给大模型重构——这套流程现在几乎成了日常。我自己也是重度用户,从去年开始就把AI编程工具嵌进了日常工作流,补全、解释、重构、写测…

📰

推理模型与生成模型:从思维链到强化学习,DeepSeek-R1如何重塑AIGC选型

简介:这份PDF资料源自北京大学多个部门联合推出的DeepSeek内部研讨系列,面向对自然语言处理与人工智能感兴趣的学生、学者及关注AI应用趋势的企业管理与技术人员,无需专业AI或IT背景即可阅读。内容围绕DeepSeek-R1推理模型展开,梳…

📰

PyTorch动态计算图与自动微分原理深度解析

简介:《动手学深度学习2.0-李沐Pytorch版》是一本面向深度学习初学者与进阶研发人员的实战型教材,聚焦PyTorch框架下的监督学习、线性回归及自然语言处理等核心任务,系统解决理论理解与代码实现脱节的问题。资源为单文件PDF格式,共…

📰

智能交通中的匝道合流LQR控制算法实践

1. 项目背景与核心挑战匝道合流控制是智能交通系统中的经典问题,也是城市快速路管理的痛点所在。当匝道车辆试图汇入主路时,传统无控制状态下会出现两种典型问题:一种是匝道车辆过于保守,导致合流区通行效率低下;另一种…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬