前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >《历史代码分析》4、发起Http请求

《历史代码分析》4、发起Http请求

作者头像
小码农薛尧
发布于 2025-03-10 04:56:25
发布于 2025-03-10 04:56:25
9100
代码可运行
举报
文章被收录于专栏:小码农薛尧小码农薛尧
运行总次数:0
代码可运行
本系列《历史代码分析》为工作中遇到具有代表性的代码。今天我们讲一下,在方法中发起Http请求,常见的就是调用第三方API,代码如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package tech.xueyao.utils;

import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;


public class HttpUtils {
    /**
     * get
     *
     * @param host
     * @param path
     * @param headers
     * @param querys
     * @return
     * @throws Exception
     */
    public static HttpResponse doGet(String host, String path,
                                     Map<String, String> headers,
                                     Map<String, String> querys)
            throws Exception {
        HttpClient httpClient = wrapClient(host);
        HttpGet request = new HttpGet(buildUrl(host, path, querys));
        for (Map.Entry<String, String> e : headers.entrySet()) {
            request.addHeader(e.getKey(), e.getValue());
        }
        return httpClient.execute(request);
    }

    /**
     * post form
     *
     * @param host
     * @param path
     * @param method
     * @param headers
     * @param querys
     * @param bodys
     * @return
     * @throws Exception
     */
    public static HttpResponse doPost(String host, String path, String method,
                                      Map<String, String> headers,
                                      Map<String, String> querys,
                                      Map<String, String> bodys)
            throws Exception {
        HttpClient httpClient = wrapClient(host);

        HttpPost request = new HttpPost(buildUrl(host, path, querys));
        for (Map.Entry<String, String> e : headers.entrySet()) {
            request.addHeader(e.getKey(), e.getValue());
        }

        if (bodys != null) {
            List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();

            for (String key : bodys.keySet()) {
                nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key)));
            }
            UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8");
            formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
            request.setEntity(formEntity);
        }

        return httpClient.execute(request);
    }

    /**
     * Post String
     *
     * @param host
     * @param path
     * @param method
     * @param headers
     * @param querys
     * @param body
     * @return
     * @throws Exception
     */
    public static HttpResponse doPost(String host, String path, String method,
                                      Map<String, String> headers,
                                      Map<String, String> querys,
                                      String body)
            throws Exception {
        HttpClient httpClient = wrapClient(host);

        HttpPost request = new HttpPost(buildUrl(host, path, querys));
        for (Map.Entry<String, String> e : headers.entrySet()) {
            request.addHeader(e.getKey(), e.getValue());
        }

        if (StringUtils.isNotBlank(body)) {
            request.setEntity(new StringEntity(body, "utf-8"));
        }

        return httpClient.execute(request);
    }

    /**
     * Post stream
     *
     * @param host
     * @param path
     * @param method
     * @param headers
     * @param querys
     * @param body
     * @return
     * @throws Exception
     */
    public static HttpResponse doPost(String host, String path, String method,
                                      Map<String, String> headers,
                                      Map<String, String> querys,
                                      byte[] body)
            throws Exception {
        HttpClient httpClient = wrapClient(host);

        HttpPost request = new HttpPost(buildUrl(host, path, querys));
        for (Map.Entry<String, String> e : headers.entrySet()) {
            request.addHeader(e.getKey(), e.getValue());
        }

        if (body != null) {
            request.setEntity(new ByteArrayEntity(body));
        }

        return httpClient.execute(request);
    }

    /**
     * Put String
     *
     * @param host
     * @param path
     * @param method
     * @param headers
     * @param querys
     * @param body
     * @return
     * @throws Exception
     */
    public static HttpResponse doPut(String host, String path, String method,
                                     Map<String, String> headers,
                                     Map<String, String> querys,
                                     String body)
            throws Exception {
        HttpClient httpClient = wrapClient(host);

        HttpPut request = new HttpPut(buildUrl(host, path, querys));
        for (Map.Entry<String, String> e : headers.entrySet()) {
            request.addHeader(e.getKey(), e.getValue());
        }

        if (StringUtils.isNotBlank(body)) {
            request.setEntity(new StringEntity(body, "utf-8"));
        }

        return httpClient.execute(request);
    }

    /**
     * Put stream
     *
     * @param host
     * @param path
     * @param method
     * @param headers
     * @param querys
     * @param body
     * @return
     * @throws Exception
     */
    public static HttpResponse doPut(String host, String path, String method,
                                     Map<String, String> headers,
                                     Map<String, String> querys,
                                     byte[] body)
            throws Exception {
        HttpClient httpClient = wrapClient(host);

        HttpPut request = new HttpPut(buildUrl(host, path, querys));
        for (Map.Entry<String, String> e : headers.entrySet()) {
            request.addHeader(e.getKey(), e.getValue());
        }

        if (body != null) {
            request.setEntity(new ByteArrayEntity(body));
        }

        return httpClient.execute(request);
    }

    /**
     * Delete
     *
     * @param host
     * @param path
     * @param method
     * @param headers
     * @param querys
     * @return
     * @throws Exception
     */
    public static HttpResponse doDelete(String host, String path, String method,
                                        Map<String, String> headers,
                                        Map<String, String> querys)
            throws Exception {
        HttpClient httpClient = wrapClient(host);

        HttpDelete request = new HttpDelete(buildUrl(host, path, querys));
        for (Map.Entry<String, String> e : headers.entrySet()) {
            request.addHeader(e.getKey(), e.getValue());
        }

        return httpClient.execute(request);
    }

    private static String buildUrl(String host, String path, Map<String, String> querys) throws UnsupportedEncodingException {
        StringBuilder sbUrl = new StringBuilder();
        sbUrl.append(host);
        if (!StringUtils.isBlank(path)) {
            sbUrl.append(path);
        }
        if (null != querys) {
            StringBuilder sbQuery = new StringBuilder();
            for (Map.Entry<String, String> query : querys.entrySet()) {
                if (0 < sbQuery.length()) {
                    sbQuery.append("&");
                }
                if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) {
                    sbQuery.append(query.getValue());
                }
                if (!StringUtils.isBlank(query.getKey())) {
                    sbQuery.append(query.getKey());
                    if (!StringUtils.isBlank(query.getValue())) {
                        sbQuery.append("=");
                        sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8"));
                    }
                }
            }
            if (0 < sbQuery.length()) {
                sbUrl.append("?").append(sbQuery);
            }
        }

        return sbUrl.toString();
    }

    private static HttpClient wrapClient(String host) {
        HttpClient httpClient = new DefaultHttpClient();
        if (host.startsWith("https://")) {
            sslClient(httpClient);
        }

        return httpClient;
    }

    private static void sslClient(HttpClient httpClient) {
        try {
            SSLContext ctx = SSLContext.getInstance("TLS");
            X509TrustManager tm = new X509TrustManager() {
                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }

                public void checkClientTrusted(X509Certificate[] xcs, String str) {

                }

                public void checkServerTrusted(X509Certificate[] xcs, String str) {

                }
            };
            ctx.init(null, new TrustManager[]{tm}, null);
            SSLSocketFactory ssf = new SSLSocketFactory(ctx);
            ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
            ClientConnectionManager ccm = httpClient.getConnectionManager();
            SchemeRegistry registry = ccm.getSchemeRegistry();
            registry.register(new Scheme("https", 443, ssf));
        } catch (KeyManagementException ex) {
            throw new RuntimeException(ex);
        } catch (NoSuchAlgorithmException ex) {
            throw new RuntimeException(ex);
        }
    }
}

此工具类应该是复制网络上的某博主的代码,只能说简单好用,提供了常用的请求方法。但是,目前推荐使用开源的Hutool工具库,它包含许多常用的操作,提高开发效率,内网开发除外。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小码农薛尧 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
用过PROFIsafe技术的你看过来!
对于大多数过程来说,很容易在不对自动化系统施加特殊要求的情况下避免风险。然而,有一些典型应用与高风险相关,例如压力机、锯床、机床、机器人、输送和包装系统、化学过程、高压操作、离岸技术、火灾和气体探测、燃烧器、缆车等。这些应用需要特别的关注安全及相关技术。
Hello工控
2024/07/30
3030
用过PROFIsafe技术的你看过来!
​SIMATIC S7‑1500R/H​ 冗余系统3--S7-1500 R/H-CPU
S7-1500R/H 冗余系统允许 PROFINET 环网中的两个 R-CPU 或 H-CPU 中有一个发生故障。如果主 CPU 发生故障,则备用 CPU 将作为新的主 CPU 在中断点继续进行过程控制。
科控物联
2022/03/29
4.9K0
​SIMATIC S7‑1500R/H​ 冗余系统3--S7-1500 R/H-CPU
西门子PLC又添新成员
近日,SIMATIC ET 200SP分布式I/O系统的新增了两款CPU扩展——CPU 1514SP T-2 PN和CPU 1514TP TF-2 PN,它们不仅具有扩展的运动控制功能,而且,以SIMATIC S7-1500控制器的创新固件版本V3.0为基础。目前两款CPU现已发布并可交付。
剑指工控
2023/08/31
2640
西门子PLC又添新成员
安全光幕的安全等级划分和区别
在制造领域里面,实现零风险是不可能的,但通过科学的风险评估和管理,可以将风险降低至可接受的范围内。
自动化大师
2024/08/14
2980
安全光幕的安全等级划分和区别
[大佬] 重新认识PROFINET 01
在《西门子PLC通信原理探秘》系列的第一篇故事中,我提到PROFINET是我在西门子技术支持生涯的起点,由于RPOFINET我开始接触以太网,理解协议,堆栈,帧,交换机,IWLAN,实时等诸多的概念,也正是探索这些概念,通过一个现场诊断的契机,我逐步完善了自认为已经掌握的PLC通信的知识,形成了以时间片和CCP为基础的PLC通信体系,真正深入到PLC内部通信-数据交换和数据处理。还有交换机技术,作为PROFINET网络中重要的有源部件,其作用不言而喻,其概念的理解有助于理解PROFINET的工作机制。甚至后来的一连串的连锁和外延知识,例如PKI(Public Key Infrastructure),这是未来,例如在使用云等APP与现场应用之间流行的加密方式,这些知识都是源于这个起点。所以在这个专栏的起点我也选择从PROFINET开始,一步步一点点给大家展示相关PROFINET的奥秘,希望从一些独特的角度给大家刷新对这些知识的认知。
科控物联
2022/03/29
1.3K0
最全的PLC通讯协议解析之EtherCAT篇(12): EtherCAT总线的安全性Safety over EtherCAT
国内目前对设备安全的认证实际上基本上没有,仅有的是加一些急停、安全门等那已经算不错的了。
Hello工控
2024/06/25
4090
最全的PLC通讯协议解析之EtherCAT篇(12): EtherCAT总线的安全性Safety over EtherCAT
【Profinet专栏】关于PROFINET与I/O总线集成应用的思考
【0. 前言】 尽管在各种智能设备的协同工作下,机器正在变得越来越聪明,但是仅有聪慧的头脑恐怕还远远不够。我们还需要灵敏而丰富的感知、敏捷而精准的执行,也许才能真正将机器的所思所想,落实为对人类有益的实际生产成果。由此可见,在探索工业4.0 智能制造的自动化项目实践中,我们将会遇到关于传感器与执行器在产品与技术应用方面越来越大的挑战。 【1. 来自执行器/传感器层的挑战】 经典的企业自动化网络模型,自上到下包含5个层级:计划编制层(Planning Level)、控制层(Control Level)、单元层(Cell Level)、现场层(Field Level)、执行器/传感器层(Actuator/Sensor Level)。其中,执行器/传感器层需要与现场层的控制器连接,因此本质上是属于现场层的一部分。之前关于 PROFINET的一些思考,主要聚焦在现场层的控制器与 IO 设备上,考虑了一些提高通讯网络稳定与快速性能以及智能化的问题,而现在有必要来看看一些 PROFINET 在执行器/传感器层的应用问题。 挑战1:安装数量越来越多,安装位置越来越分散。想要使机器具有丰富的感知,机器的每个部位上都有传感器覆盖的必要;类似的,想要实现丰富的机械动作输出,执行器也有必要如此覆盖在机器的各个部位;由此产生了大量且分散的IO 信号需要处理。对于收集处理大量的 IO 信号,一个大容量的且功能集成较多的 IO 设备也许就可以解决问题。但是每个PROFINET 控制器带动 PROFINET设备的能力(设备数量)都有各自的上限(就像一个班级中不可能有无限多的学生)。由此我们可能在处理过多分散的 IO信号时,发现仅靠一个控制器网络内的设备,还不足以覆盖这么多的分散区域。 挑战2:功能要求越来越高,接线要求越来越简洁。为了实现机器感知的灵敏、动作的敏捷,执行器/传感器层对于自身发送接收 IO信号的更新时间要求是很高的,甚至会低于控制器的循环扫描周期。而目前执行器/传感器的产品种类与功能也越来越丰富,电气控制接口形状遵循各自不同的协议规范,电气信号格式也多种多样,例如电压型电流型模拟量、数字开关量等等。这么多分散的不同规格的信号线缆接到IO 设备上,需要 IO 设备本身集成各种类型的 IO模块,不仅增加了电气调试编程的复杂度,而且增加了电气接线施工与故障诊断的复杂度。终端用户往往也希望对于各种各样的执行器/传感器层 IO信号线,最好也能类似 PROFINET那样一网到底,只需一种通讯线,就搞定所有类型的执行器/传感器产品方案的电气接线与控制工作。 由此可见,如果有一种擅长于处理执行器/传感器层 IO 信号的总线网络,作为 PROFINET 网络的延伸,与 PROFINET集成在一起,共同管理整个现场层的通讯网络,就显得越来越有意义且有必要了。 【2. 关于 PROFINET 与 I/O 总线集成应用的方案】 如下图所示,随着工业以太网技术的普及与相关产品的发展,从传统的手动工位到整个自动化工厂,我们都可以用 PROFINET通讯方案将它们连接在一起。而从应用复杂度的角度来看,对于数据结构相对简单,数量众多布局分散的执行器/传感器信号处理来说,更轻量级的I/O 总线协议有时候显得性价比更高。
剑指工控
2021/11/09
7410
【Profinet专栏】关于PROFINET与I/O总线集成应用的思考
FANUC机器人PROFINET双通道板卡组态
FANUC机器人是四大工业机器人品牌(ABB、KUKA、FANUC、Yaskawa Electric)之一,广泛应用于汽车厂各车间中,用于上下料、点焊、弧焊、涂胶、弧焊、喷涂、视觉等工艺。FANUC机器人支持Ethernet、FL-net、DeviceNet、PROFIBUS、POFINET、CC-Link、CC-Link ie、EtherNet/IP、EtherCAT通讯,PROFINET通讯是其主要通讯方式之一,其PROFINET通讯板卡用于和上游PLC及其下挂IO设备进行通讯。
剑指工控
2021/11/25
2.7K0
FANUC机器人PROFINET双通道板卡组态
什么是PCS?
PCS7是西门子的DCS系统,基于过程自动化,从传感器、执行器到控制器,再到上位机,自下而上形成完整的TIA(全集成自动化)架构。主要包括Step7、CFC、SFC、Simatic Net和WinCC以及PDM等软件,组态对象选用S7-400高端CPU,一般应用于钢铁和石化等行业。作为先进的过程控制系统,SIMATIC PCS7 形成了一个带有典型过程组态特征。
剑指工控
2021/11/09
1.5K0
选择Profinet的十大理由!!!
截止到2020年,与前一年相比,安装的PROFINET设备数量增长了超过22%,总计达到了4000万台。
Hello工控
2024/08/21
2040
选择Profinet的十大理由!!!
100问Profibus总线技术?等你来解答!
本期内容,您如果有更好的解答,欢迎留言讨论(留言备注具体的问题序号哦!)。如果觉得不错,还请点赞、收藏和转发分享哦!!!
Hello工控
2024/07/30
2230
100问Profibus总线技术?等你来解答!
有“贝”而“莱” 强势围观 | 采用openSAFETY的X20安全产品在半导体设备中的应用 004
半导体设备例如涂胶机、显影机、清洗机等设备在做工艺时会使用多种液态化学品,机台设置各种电磁通断阀实现液路控制,为了防止管路出现漏液,在关键位置会布置漏液传感器,当出现漏液,必须立即关断阀体,切断液路。此外,机台设置有安全门开关和急停开关,当开关触发时,必须紧急停止运动部件或者切断对应单元电源。但正常执行安全动作的前提是软件控制平台能够正常工作,倘若发生漏液或者安全门被打开,控制平台出现异常未做出响应,未将阀体关断或将运动部件紧急停止,可能会引起严重后果。为了保证安全,引进一套独立于软件控制平台的安全系统,同时采集漏液、安全门以及急停信号,当意外发生,即使软件控制平台未做出保护动作,安全控制器也能及时做出安全动作,避免事态持续恶化。
剑指工控
2021/11/05
6630
Profibus vs. Profinet
我们在介绍Profinet总线技术的时候,开篇就提到它是Profibus技术的升级,他们之间有非常密切的联系,甚至同一网络可以完美兼容。
Hello工控
2024/08/21
2260
Profibus vs. Profinet
5G和PROFINET实现工业4.0的实时通信与自动化
多年来,PROFINET一直是全球众多自动化系统的重要组成部分。然而,随着工业5G网络的引入,行业面临一个挑战:如何将现代5G网络的优势与已建立的PROFINET通信结合起来,并在数百个分散的接口和设备上高效地集中管理?
Hello工控
2024/09/06
2700
5G和PROFINET实现工业4.0的实时通信与自动化
Profinet相关
KUKA.PROFINET MS :包括 PROFINET Controller、PROFINET Device 和PROFIsafe Device。
用户4442670
2022/06/29
1.9K0
Profinet相关
什么是Profinet?
投票大部分朋友选择不是,当然这个问题实际上本身有些问题。如果说Profinet是不是一种基于EtherNet的技术,我想这个答案是确定的。
Hello工控
2024/08/16
2020
什么是Profinet?
PLC和机器人通信怎么配置
各位小伙伴们,你们好,又好久没更新了。你们是不是以为我把公众号的秘密给忘了! 哈哈哈
用户4442670
2022/06/29
4K0
PLC和机器人通信怎么配置
Profinet和Ethernet两者对比
从字面上看,这两者联系非常密切。通过上两期的介绍,基本了解到了:PROFINET是由PROFIBUS和PROFINET国际组织(PI)创建的工业以太网解决方案。以太网是全球最流行的用于创建网络的通信介质。
Hello工控
2024/08/16
7780
Profinet和Ethernet两者对比
【Profinet专栏】关于结构化思维在PROFINET诊断中应用的思考
【0. 前言】 工业4.0趋势下的机器故障诊断,正在向更智能化的预防性维护系统发展:通过构建覆盖设备上各个部件的传感器与通讯网络,几乎所有电动、气动、液压、机械元件的状态数据都能得到实时监控,由此可结合机器学习与大数据分析,再结合日趋完善的故障处理知识库与决策系统,实现对机器异常状态的实时感知,预测出可能的故障隐患点,第一时间通知用户并提供最优化的维护方案。那么,这是否就意味着,经典的基于人的经验的故障诊断,今后就毫无用武之地了呢? 【1.传统故障诊断的价值与局限性】 尽管拥有了越来越强大的诊断工具,人,依旧是当前故障诊断活动中的核心。因为故障诊断其实是一个非常复杂的活动,不单单面向机器,而且面向各种各样不同知识与社会背景的用户。这就要求诊断者不仅拥有丰富的机器故障处理经验,而且需要具备良好的沟通协作与社交能力,因此体现出一定的服务价值。但同时我们也必须承认,人在当前机器故障诊断中的局限性也越来越明显了,因为机器正变得越来越复杂,哪怕是经验再丰富的诊断者,在面对千奇百怪的疑难杂症时,也难免会遇到自身知识技能的盲点。所以很多长期从事现场诊断的工作者都会有相似的体验:当遇到一个前所未见的故障现象,苦思冥想无果,承受着各方的压力,感觉是苦恼的。这个时候,想要化解被动局面就变得难上加难,而想尽快获得支援也不是一件容易的事情,因为首先你要将这个连你自己都没搞清楚是怎么回事的问题,客观的描述出来,让别人充分了解你所处的困境、异常的内容与背景,才有可能引起对方的重视。那么如何突破这些困局?不妨试试结构化思维的方法。 【2.结构化思维有助于解决传统故障诊断遇到的难题】 在传统的基于人的经验的诊断过程中,除了对诊断者经验的过度依赖,还伴随着跳跃性思维所产生的一些不确定性因素。跳跃性思维,有时候能起到剑走偏锋出其不意的神奇效果,帮助人们在故障诊断中走出一条捷径,但是一旦计划落空其后果也是相当尴尬,可能会使诊断活动陷入停滞甚至混乱。当面对现场出现的疑难杂症,能够保持头脑冷静采用结构化思维,相对来说是个更加稳妥的选择。因为这样就能使我们从多个侧面进行思考,深刻分析导致问题出现的原因,系统性制定行动方案,采取性价比最优的手段,使诊断计划得以高效率开展,有助于使问题得到彻底解决,也有助于形成信息全面逻辑清晰的问题调研报告。下面以典型的工厂自动化项目中PROFINET通讯网络问题诊断为示例,推演结构化思维方法论在机器故障诊断活动的应用思路。 【3.1.结构化诊断步骤1:4W1H,充分理解面临的问题】 WHAT:故障的表面现象是什么?例如:用户看到的是某机电设备无法动作、生产线停机,但是更换备件仍不能修复,那就不是头痛医头脚痛医脚那样简单。搞清楚表象背后的本质是什么?例如:借助各种通讯工具(特别是远程访问软件)与现场联系,了解用户曾经做了什么,获取现场设备与控制器状态的照片与录像,获取报警信息与报错代码,如果发现设备本身功能是正常的,而有证据显示控制器曾经丢失与设备的网络连接与数据交换,那么就可以初步确认故障本质其实是现场总线/以太网通讯控制网络方面,或者是机器设备系统集成方面的问题。搞清楚该机器遵循的是什么行业的什么公司的什么标准?例如:某些重大自动化项目,在规划阶段就已经定义了通讯网络的协议与架构,具体到参数设置固件版本等细节都有明文规定,这些都是标准的一部分,事先需要充分了解。 WHEN:什么时候 / 每隔多长时间发生该故障?例如:长时间关机后再上电时 / 每次开机都有 / 周期性可人为重现 / 偶发但可人为重现 / 偶发且无法人为重现(这是最困难的一种情况,往往重启后又正常了,需要一直等到下一次发生类似故障时,保护好现场,做尽可能完整的故障记录表,才有可能进行下一步的原因分析)。 WHERE:故障点具体在哪里?
剑指工控
2021/11/09
3640
【Profinet专栏】关于结构化思维在PROFINET诊断中应用的思考
PROFIBUS DP-V0、DP-V1 和 DP-V2 区别在哪?
PROFIBUS DP(Decentralized Periphery分散外设)的应用领域是完整的生产自动化,其中高数据速度、低连接成本和即插即用是核心。生产自动化中的应用通常通过创建由远程I/O、变频器、传感器和执行器组成的网络来实现。如果电源供应和布线不是问题,那么在这个环境中可以轻松实现可靠的安装。
Hello工控
2024/07/30
7470
PROFIBUS DP-V0、DP-V1 和 DP-V2 区别在哪?
推荐阅读
相关推荐
用过PROFIsafe技术的你看过来!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验