
简介围绕S7-1200、S7-1500与DASSIDirect通讯这一常见工程难题这份文档面向已具备一定博途基础的自动化工程师与现场调试人员系统梳理配置要点与兼容性限制。内容涵盖在TIA博途中启用PUT/GET远程伙伴访问、取消数据块优化块访问等前置设置DASSIDirect在块项目、计数器/定时器直接访问、周期服务与SAPI方面对这两个系列的不支持特性以及LREAL、DTL等数据类型的位长、取值范围与各存储区寻址语法可帮助读者快速判断通讯失败的成因并规范变量写法。压缩包内共1个docx文件约44KB篇幅精炼便于随查随用。已有2885人学习下载适合作为现场调试时的对照手册与排错参考。1. 点位全 Bad 的那个夜晚问题根本不在网线帮一个做产线数据采集的团队看一套通讯PLC 侧是 S7-1200 和 S7-1500 混着用上位机用 DASSIDirect 从 DA 口取数。博途里编译下载一路绿灯DASSIDirect 的服务也起来了可点位一加就是 Bad日志里连条像样的报错都没有。折腾到后半夜才定位到卡点跟网络一点关系没有就在两处勾选项上CPU 属性里的 PUT/GET 没放开数据块还带着「优化的块访问」。这套 S7-1200 / S7-1500 与 DASSIDirect 的组合在存量产线上特别常见常见到很多人默认它「插上就能通」真翻车的时候又因为报错太安静连从哪儿下手都不知道。这篇记录的是一套能照着走完的配置顺序先把环境清点清楚再改博途侧那两刀然后落 DASSIDirect 的 Device Group 和点位语法最后是排查和验证。适合手上正卡在通讯不上、或者准备新接一套 S7-1200/1500 数据采集的人。2. 装之前先把环境列清TIA 版本、访问通道和三个开关2.1 三样东西的版本必须对得上这套通讯牵扯三方博途TIA Portal、DASSIDirectSIDirect DAServer、PLC 固件。三方里任何一个版本对不上表现出来的症状都差不多——连得上但读不到或者读得到但值不对。所以动手之前先做一件事把现场这三样各自的版本抄在一张纸上别凭记忆。博途这边最稳的做法是「用哪个版本建的项目就用哪个版本下载」。高版本博途打开低版本项目再下回去块结构、属性页位置都可能变尤其是「保护」下的连接机制选项不同年份版本的位置和措辞会有出入照着别人的截图找很容易找不到。DASSIDirect 属于老的 DA 通道产品它只走 DA不走 OPC UA。这意味着你在选型阶段就得接受它的能力边界不支持的东西是协议层不支持不是配置没调对。PLC 固件这边S7-1200 要能被远程伙伴用 PUT/GET 访问固件本身得支持这个连接机制太老的固件在保护属性里根本看不到这个勾选项这时候不是配置问题是得先升级固件。版本清单建议按下面这张表记出问题的时候逐一对照比翻聊天记录快得多。项要记的内容出问题时先看这里的原因博途年份版本、项目来源版本属性页位置不同、下载后组态被覆盖DASSIDirect安装版本、DAServer 实例名点位语法支持范围、Device Group 可选项PLCCPU 型号、固件版本保护属性里没有 PUT/GET 选项通讯路径网段、机架/插槽连不上、连上后立刻断2.2 网络和访问通道先打通再谈点位S7 通讯走的是 TCP 102 端口S7-1200 和 S7-1500 默认机架 0、插槽 1。这两个值在 DASSIDirect 建通道的时候要填填错了服务起得来但永远连不上 PLC。常见做法是先在 DAServer 里把通道建好、只填 IP 和机架插槽不加任何点位看通道状态能不能到「已连接」能到再加点位。反过来先堆一堆点位再调通道报错会互相掩盖很难判断到底是链路问题还是点位问题。网络侧还有一件容易被跳过的事PLC 和上位机是不是在同一个二层里。跨网段、走 NAT、经过工业防火墙都可能让 102 端口通、但 S7 连接建不起来。这种场景下别急着怀疑 DASSIDirect先用端口探测确认链路层是通的把问题范围缩到最小。# 确认 PLC 的 S7 端口是否可达102 是 S7 通讯的固定端口 # -z 只探测不发送数据-v 输出结果-w 3 超时 3 秒 nc -zv -w 3 192.168.10.21 102 # 没有 nc 的机器可以用 nmap 代替只探这一个端口 nmap -p 102 192.168.10.21这两条命令只回答一个问题102 端口通不通。通说明网络和 PLC 的监听都正常后面所有问题都在组态和点位上不通先解决网络别往下走。我一般会把这个结果截图存到项目文档里下次再出问题第一步就能排除掉一半可能性。2.3 PLC 侧三个开关的初始状态在动博途之前先把 PLC 侧三个关键开关的当前状态确认一遍改完之后再确认一遍。这三个开关分别是CPU 的连接机制里有没有放开 PUT/GET、数据块的「优化的块访问」有没有取消、以及数据块是不是被设成了「仅内部访问」之类的限制。前两个是这套通讯的硬性前提第三个属于顺带检查很多读不到的情况最后查出来是块本身的访问属性有问题。这一步不需要改任何东西只是记录。养成「改之前先记状态」的习惯出问题时才知道是哪一步引入的变量。血泪经验是同时改了三处再一起下载一旦不通你根本没法判断是哪一处改错了。3. 博途侧预配置PUT/GET 和「优化的块访问」这两刀3.1 S7-1500 的 CPU 属性把 PUT/GET 放开这一步是整套配置里最关键、也最容易被漏掉的一步。S7-1500 默认不允许远程伙伴用 PUT/GET 访问不放开的话DASSIDirect 能建立连接、能读到 CPU 的一些基本信息但一读数据块就返回错误而且错误信息非常克制几乎不告诉你原因。操作路径是固定的在博途左侧项目树里找到 S7-1500 的 CPU右键打开「属性」在左侧窗格选「保护」右侧的「连接机制」区域里勾上「允许来自远程伙伴的 PUT/GET 通信访问」确定。S7-1200 同样需要这一步。原文里对 S7-1500 是单独一段说明对 S7-1200 和 S7-1500 是用同一套数据块设置实操上两边的 CPU 保护属性都要检查别只改 1500 就以为 1200 也一样。提示勾选项的名称在不同年份的博途里措辞略有差别但都在「保护」→「连接机制」下认位置比认字准。改完这一处硬件组态就变了必须重新编译并下载硬件组态只下载程序块不生效。这一步很多人栽过改完属性直接去下载程序块界面上一切正常实际 CPU 里还是旧组态。3.2 数据块属性取消「优化的块访问」第二刀在数据块上。S7-1200 和 S7-1500 新建数据块默认勾着「优化的块访问」块内变量按符号访问、没有固定偏移编译器自己排布。DASSIDirect 走的是绝对地址访问它要的是「DB 号 字节偏移」优化块对它来说是一片没有地址的空间自然读不到。操作路径在项目树里找到目标数据块右键「属性」左侧选「属性」把「优化的块访问」这个勾去掉确定。这里有个连带影响必须提前说清楚取消优化之后块内变量的偏移会重新按标准排布计算之前所有基于旧偏移写的点位全部作废。如果这个块已经被别的上位机、触摸屏或者别的采集程序用过那些点位也得跟着改。所以取消优化这个动作最好在项目早期做块里变量还不多的时候做越晚代价越大。实操上我一般会这样做先把块里的变量顺序按「将来要读的点位」重新排一遍再取消优化然后编译从交叉引用或者块属性里把每个关键变量的实际偏移记下来做成一张偏移表后面写点位直接查表不靠猜。3.3 改完之后的下载顺序两处都改完之后下载顺序是有讲究的先编译整个站点确认没有错误然后下载硬件组态CPU 会重启一次等它起来再下载程序块。反过来的话程序块先下去但硬件组态还是旧的PUT/GET 依然没放开你会以为改动没生效。下载完成后回到 CPU 的在线诊断看连接资源。S7-1200/1500 的连接资源是有限的PUT/GET 占的是其中一类如果现场已经有多个上位机、多个 HMI 在连可能会出现「勾了选项但还是连不上」的情况这时候要看的是连接资源有没有被占满而不是反复改那个勾选项。4. DASSIDirect 侧组态Device Group、Poke Mode 与点位语法4.1 Device Group 的增删改和三档 Poke ModeDASSIDirect 里点位不是直接挂到通道下的中间隔一层 Device Group。进入方式是在 New_S7Cp_000 Parameters 或者 New_S7Cp_200_000 Parameters 配置视图里点 Device Groups 标签页。这里要注意一个细节S7CP_200 这个对象下的 device group 是不可编辑的别在那儿反复右键找不到编辑项。新建的方式是右键空白处 Add名字自己起大小写不敏感所以别用Line1和line1当两个组会撞。删除是右键 Delete编辑是右键 Edit 打开 Device Group Parameters。Edit 对话框里有五个可配置项其中 Poke Mode 的三档是取舍的重点模式行为什么时候用Control mode严格保持写入顺序不折叠任何写入值配控制类客户端、写入顺序有业务含义时Transition mode保持顺序但允许折叠同一项保留第一、第二、最后一个值默认值滑块类连续写入场景Full optimization允许改变顺序只写最后一个值配方下载这类大批量、顺序无关的写入默认是 Transition mode。这个默认值不是随便定的上位机上拖滑块会在一瞬间产生大量写值如果每一个都原样下发总线会被打满界面还会一顿一顿地抖。Transition mode 保留首尾和中间一个既压住了流量又不至于把滑块的最终位置丢掉。Control mode 的代价要说清楚它一个值都不丢全部按序处理写入频繁的时候总线负载和响应时间都会明显上去。只有在写入顺序真的影响业务结果的时候才选它比如一批联锁条件必须按顺序写进去。Full optimization 性能最好因为它只写最后一个值。但这也意味着中间过程值全部丢失如果对方逻辑依赖中间状态就会出现「配方下下去了但设备动作不对」这种极难查的问题。4.2 Cyclic Services文档两处口径不一致时怎么落原始资料里有一个明显的自相矛盾前面一节说 S7-1200 和 S7-1500 不支持 cyclic services 和 SAPI后面 Device Group 那一节又详细讲了怎么配 Cyclic Services、怎么限制数量。这种文档内部的打架在工业软件手册里并不罕见通常是不同版本、不同模块的内容拼在一起留下的。落到实操我的处理方式是默认先勾上「Disable S7 cyclic service」让 DASSIDirect 用轮询的方式取数先保证功能通再谈性能。理由很实在——轮询一定能用cyclic service 在不支持它的硬件上不一定能用先通再优。如果不勾 Disable那就要配两个值「Maximum available」和「Limit cyclic services to」后者允许范围 1 到 150默认是 1。这个「1」很容易被忽略默认只给这个 device group 一个循环服务额度点位一多超出的部分 DASSIDirect 会自动退化成轮询消息于是你会看到一部分点位更新很快、另一部分明显滞后还查不出原因。具体给多少取决于这台 PLC 上还挂了多少别的连接。如果 PLC 的循环服务资源已经被别的系统占了一部分就把这个值调小把额度分给多个 device group如果这台 PLC 基本只有这一套采集在用可以直接用最大可用值。还有两个和性能直接相关的开关值得一起看。一个是 Peripheral Access 下的「Read contiguous IO」当地址空间里有空洞、输入输出地址不连续时勾它不强求连续读不勾的话遇到空洞可能整段读失败。另一个是更新周期长周期的 device group 不该占着循环服务额度把它单独分到一个组里并关掉循环服务是常见的拆分方式。4.3 LREAL 和 DTL 的点位怎么写S7-1200/1500 有两个 S7-300/400 时代没有的数据类型写法必须按新语法来照抄老项目的点位名一定读不到。LREAL 是 64 位浮点遵循 ANSI/IEEE 754-1985范围从 -1.7976931348623158e308 到 -2.2250738585072014e-308加上 ±0再到 2.2250738585072014e-308 到 1.7976931348623158e308。写法是DB,Id,LREALm带数组就是DB,Id,LREALm,v标志位区是FLREALm/MLREALm输入区ILREALm/ELREALm输出区OLREALm/ALREALm/QLREALm外设输入PILREALm/PELREALm外设输出POLREALm/PALREALm/PQLREALm。DTL 是 12 字节结构字段排布是固定的不知道这个排布就没法判断偏移对不对字节字段类型范围0,1YearUINT1970 到 25542MonthUSINT1 到 123DayUSINT1 到 314WeekdayUSINT1周日到 7周六5HourUSINT0 到 236MinuteUSINT0 到 597SecondsUSINT0 到 598-11NanosecondsUDINT0 到 999,999,999DTL 的后缀决定返回什么类型不带后缀返回 VT_BSTR范围 1970-1-1-0:0:0.000000000 到 2554-12-31-23:59:59.999999999分辨率到纳秒带TREAL返回 VT_DATE分辨率只到秒。VT_DATE 的显示格式支持 YYYY/MM/DD、MM/DD/YYYY、YYYY-MM-DD 三种。如果上位机那边对时间精度要求不高用 TREAL 更省事要纳秒级就得走不带后缀的字符串。常用类型的写法整理成一张表写点位的时候直接对类型DB 内写法数组写法返回类型位D5,X0.3—VT_BOOL字节D5,B10D5,B10,100VT_UI1字D5,W20D5,W20,50VT_UI2双字D5,D40D5,D40,20VT_UI4整数D5,INT60D5,INT60,30VT_I2双整数D5,DINT80D5,DINT80,10VT_I4浮点D5,REAL100D5,REAL100,10VT_R4长浮点D5,LREAL200D5,LREAL200,564 位浮点字符串D5,S300,50—VT_BSTR时间D5,DTL400D5,DTL400,3VT_BSTR / VT_DATE表里d是数据块号范围 1 到 65535m、n、x是起始地址范围 0 到 65535位号y是 0 到 70 是最低位、7 是最高位v是数组元素个数。这里有个容易踩的细节LREAL 那节写的数组长度是 1 到 65535而数据块总表里数组长度写的是 0 到 65534两处差一实际写的时候按保守的来从 1 开始数。字符串还有一层容易忽略的长度关系S7String 写法是S7Sx,w或S7STRINGx,w这个w是净字符数实际在 S7 报文里占w1在 PLC 里的字符串表示占w2。写点位的时候按净长度填别把这两个额外字节算进去算进去了读出来的就是错位的乱码。4.4 用一个小脚本把点位名拼对点位名是纯字符串手写特别容易错尤其是带 offset 和数组长度的。我的做法是写个十几行的小脚本把「DB 号 类型 偏移 长度」拼成点位名顺便把范围校验掉省得在 DAServer 里一个个试。# das_point.py 拼 DASSIDirect 在 S7-1200/1500 上的点位名并做范围校验 # 只覆盖数据块DB场景其它存储区改前缀即可 def db_point(db, kind, offset, lengthNone, bitNone, trealFalse): db : 数据块号 1-65535 kind : 类型关键字如 B / W / D / INT / DINT / REAL / LREAL / DTL / S offset : 起始字节地址 0-65535 length : 数组元素个数不传表示单点 bit : 位号 0-7只有 kindX 时用 treal : 仅对 DTL 有效True 时追加 TREAL 后缀拿 VT_DATE if not 1 db 65535: raise ValueError(fDB 号越界: {db}) if not 0 offset 65535: raise ValueError(f起始地址越界: {offset}) name fD{db},{kind}{offset} if bit is not None: if kind ! X or not 0 bit 7: raise ValueError(f位号非法: {kind} / {bit}) name f.{bit} if length is not None: if not 1 length 65534: raise ValueError(f数组长度越界: {length}) name f,{length} if treal: if kind ! DTL: raise ValueError(TREAL 后缀只能用在 DTL 上) name TREAL return name if __name__ __main__: # 一批典型点位输出后直接粘到 DAServer 里 print(db_point(5, X, 0, bit3)) # D5,X0.3 print(db_point(5, REAL, 100, 10)) # D5,REAL100,10 print(db_point(5, LREAL, 200, 5)) # D5,LREAL200,5 print(db_point(5, DTL, 400, trealTrue)) # D5,DTL400TREAL print(db_point(5, S, 300, 50)) # D5,S300,50这个脚本本身不连 PLC它的价值在一致性一批点位从同一份偏移表生成就不会出现「这个写了 100、那个写成 110」的低级错。数组长度上限我按 65534 卡的比 LREAL 那节写的 65535 保守一档理由是宁可少读一个元素也别让整条点位在运行时才报错。位号校验顺带挡住了一个常见写法错误——把D5,X0.3写成D5,X0,3后者会被当成数组长度 3语义完全变了。5. 通讯不通的排查5 条踩坑记录5.1 点位全 Bad通道却是「已连接」现象DAServer 里通道状态正常能连上 PLC但加进去的点位全部是 Bad 质量日志里没有明确报错。原因CPU 保护属性里的 PUT/GET 没放开。这种情况下 S7 连接本身能建立因为那是另一类连接资源但读数据块走的是 PUT/GET 通道没放开就一律拒绝。解决回博途打开 CPU 属性保护 → 连接机制勾上「允许来自远程伙伴的 PUT/GET 通信访问」编译下载硬件组态等 CPU 重启完再试。S7-1200 和 S7-1500 都要检查别只改一台。5.2 能读到值但值和 PLC 里对不上现象点位质量是 Good读回来的数字也有但和监控表里看到的值完全不是一回事或者读浮点读出来是一串乱码。原因数据块还带着「优化的块访问」。优化块里的变量没有固定绝对地址编译器自己排你按老偏移去读读到的是别的变量的一半字节拼出来的当然是乱的。解决右键数据块 → 属性 → 属性取消「优化的块访问」重新编译下载。注意这一步会让块内所有变量偏移重排之前写的点位全部要按新偏移表重写如果块已经被别的系统引用过那些点位也得同步改。5.3 用 Cx / Tx 订计数器和定时器一个都读不上现象照着 S7-300/400 的老点位写C1、T5这类名字在 S7-1200/1500 上全部失败。原因S7-1200 和 S7-1500 不支持客户端直接访问计数器和定时器老的 Cx / Tx 及其后缀在这两个系列上不适用。这是协议层的能力差异不是写法问题怎么调都读不到。解决改走数据块。在 PLC 程序里把内部 IEC 计数器、定时器的当前值周期性写到一个非优化数据块的变量里上位机读那个 DB 变量。多一层中转但这是这套组合下唯一稳的做法。5.4 S7-1200 上用 Block Item加不进去现象在 S7-1500 上配好的 Block Item 用法搬到 S7-1200 上建不出来或者建出来读不到。原因Block Items 只支持 S7-300、S7-400 和 S7-1500不支持 S7-200 和 S7-1200。Block Items 本身还分只读和只写两组用法和普通点位不同。解决S7-1200 走普通的数据块点位一个变量一个点位地配。如果点位数量多用上一节那个脚本批量生成别指望 Block Item 省事。5.5 数组和字符串读到一半失败现象单个点位都正常一读长数组或者长字符串就报错或者前面几个元素正常、后面的全是坏质量。原因单次读取受 PDU 大小限制。循环服务下能读的最长字符串或数组是 PDU 大小减 32 字节上位机软件本身也有上限能处理的最长字符串是 131 字节写入侧的上限是 256 字节或 PDU 大小减 28 字节取两者中较小的那个。解决把长数组拆成多段读每段控制在 PDU 减 32 以内段与段之间留出对齐余量。字符串先确认上位机能处理多长超过 131 字节的部分不要指望它能完整显示。另外 DDE/SuiteLink 通道下数组返回的是 HexASCII双字类数值超过 2147483647 会被夹到最大值质量位显示 Clamp High看到这个提示不要以为是通讯故障是数值超范围被截断了。6. 装完怎么验证从端口到点位的三段确认配置做完不等于通了得按层验一遍每一层都有明确的通过标准不要跳步。第一段验链路。先 ping再探 102 端口两条都过才往下走。这一步不通过后面所有配置都是白做。# 第一段链路确认两条都通才继续 ping -c 4 192.168.10.21 nc -zv -w 3 192.168.10.21 102 # 期望输出里出现 succeeded 或 open出现 refused / timeout 就停下来查网络第二段验单点。在 DAServer 里只加一个位点位比如D5,X0.3然后在 PLC 侧把这一位置 1、置 0观察上位机的值和质量位是否同步变化。这一步的关键是「用已知值核对」不是看它有没有数字。质量 Good 但值不动说明偏移错了或者优化块没取消回第 5 章第 2 条。第三段验类型和边界。按下面的顺序抽检每类挑一个点用 PLC 监控表写入已知值比对读回结果抽检项点位示例通过标准位D5,X0.3置 1 读 1置 0 读 0质量 Good浮点D5,REAL100写入 123.45读回偏差在单精度精度内长浮点D5,LREAL200写入大数值不溢出、不截断时间D5,DTL400TREAL读回时间与 PLC 时钟一致秒级对齐字符串D5,S300,50读回内容与 PLC 内一致长度不超 131 字节数组D5,INT60,30首尾元素都能读对中间不出现坏质量抽检完还要做一件事让它连续跑一段时间再看。我一般会挂两三个小时期间记录一次质量位变化次数和更新间隔。循环服务额度不够的组会在这段时间里表现出周期性的滞后短时间抽检是看不出来的。从那以后我每次配这套东西都强制走一遍「链路、单点、类型」这三段哪怕只是改了一个数据块属性也一样。因为这套组合的报错实在太安静了不主动验你永远不知道自己配的是不是真的通了。希望帮到你。本文还有配套的精品资源点击获取