掌握JavaScript的数学与时间魔法:Math和Date对象详解

​🌈个人主页:前端青山
🔥系列专栏:JavaScript篇
🔖人终将被年少不可得之物困其一生

依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript-Math和Date对象详解

目录

Math对象(Math对象不能new!!!!)

案例

计时器

Date对象

如何创建日期对象?

如何访问日期对象中的信息?

如何设置日期对象中的信息?

如何以本地格式的字符串输出日期对象?

案例

简单的代码异步执行机制

Math对象(Math对象不能new!!!!)

  1. Math.PI 圆周率

  2. Math.abs() 求绝对值

  3. Math.round() 四舍五入

如果负数时, > 0.5 进一 <=0.5 舍去

console.log(Math.round(4.5)); //5
console.log(Math.round(4.4)); //4
console.log(Math.round(-4.5)); // -4
console.log(Math.round(-4.5000001)); // -5
console.log(Math.round(-4.4)); //-4
console.log(Math.round(-4.6)); //-5
  1. Math.ceil() 向上取整

console.log(Math.ceil(4.1)); //5
console.log(Math.ceil(4.9)); //5
console.log(Math.ceil(-4.1)); //-4
console.log(Math.ceil(-4.9)); // -4
  1. Math.floor() 向下取整

console.log(Math.floor(4.1)); //4
console.log(Math.floor(4.9)); //4
console.log(Math.floor(-4.1)); //-5
console.log(Math.floor(-4.9)); // -5
  1. Math.max() 最大值

  • 求数组中最大值: Math.max.apply(null,数组) Math.max( ... 数组名)

  • 求数组中最小值: Math.min.apply(null,数组) Math.min( ... 数组名)

var arr = [2,3,1,4,5,3,4];
console.log(Math.max(2,3,1,4,5,3,4));
console.log(Math.min(2,3,1,4,5,3,4));
console.log(Math.max.apply(null,arr));
console.log(Math.min.apply(null,arr));
  1. Math.pow(m,n) 求m的n次方

  2. Math.sqrt(n) 求n的开方

  3. Math.random() 随机数 0 <= n < 1

Math.floor(Math.random() * (max - min + 1) + min) 推荐 Math.round(Math.random() * (max - min) + min)

function random(min,max){
    if(min > max){
        var t = min;
        min = max;
        max = t;
    }
    return Math.floor(Math.random() * (max - min + 1) + min);
}

案例

  1. 实现猜数字游戏(1~10,三次机会)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input type="button" value="你猜?" id="btn">
    <script>
        //实现猜数字游戏(1~10,三次机会)
        /*
            1~10 ? 得到一个什么样的信息? 随机数
            三次机会?想到了什么呢? 用户输入三次,循环3次
            如果第一次用户就猜中了?后面的两次机会还需要吗?如果不需要了?怎么办? break
        */
        //一、获取页面元素
        var o_btn = document.getElementById('btn');
        //二、添加事件
        o_btn.onclick = function(){
            //1. 随机一个整数:(1~10)
            var rand = Math.floor(Math.random() * 10 + 1);
            //2. 让用户去猜,且有三次猜的机会,所以使用循环
            for(var i = 1;i < 4;i ++){
                //问用户接收一个整数
                var n = parseInt(prompt('请输入1~10中的一个整数:'));
                //检测用户输入的整数是否等于随机数
                if(rand === n){
                    alert('您猜中了!');
                    break; //退出循环
                }else if(n > rand){
                    alert('您猜大了!');
                }else{
                    alert('您猜小了!');
                }
            }
            //3. 三次机会用完了
            if(i === 4){
                alert('很遗憾,你挑战失败!正确的数字是:' + rand);
            }
        }
    </script>
</body>
</html>
  1. 封装一个随机颜色的函数(至少封装三种)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #box{
            width: 100px;
            height: 100px;
            border: 1px solid black;
        }
    </style>
</head>
<body>
    <input type="button" value="你猜?" id="btn">
    <div id="box"></div>
    <script>
        //封装一个随机颜色的函数(至少封装三种)
        /*
           1. 单词 ['red','green','blue']  pass
           2. #十六进制   6个    #ffffff  白色     #000000  黑色
           3. rgb(0~255,0~255,0~255)
        */
        function randColor01(){
            //              在乘的时候会自动将(0xffffff)这个十六进制数转为十进制,求出随机数后再转为十六进制
            return '#' + Math.floor(Math.random() * 0xffffff).toString(16);
        }
        function randColor02(){
            var str = '#';
            //颜色有6个十六进制数
            for(var i = 0;i < 6;i ++){
                str += Math.floor(Math.random() * 17).toString(16);
            }
            return str;
        }
        function randColor03(){
            var arr = [];//放置颜色值
            for(var i = 0;i < 3;i ++){
                arr.push(Math.floor(Math.random() * 256)); //[45,23,233]
            }
            //              45,23,233
            return 'rgb(' + arr.join() + ')';
        }

        function randColor04(){
            var str = 'rgb(';//放置颜色值
            for(var i = 0;i < 3;i ++){
                str += Math.floor(Math.random() * 256) + ','; //'rgb(33,44,55,'
            }
            return str.slice(0,-1)  + ')';
        }
        console.log(randColor01());
        console.log(randColor02());
        console.log(randColor03());
        // alert(randColor03());

        //获取按钮
        var o_btn = document.getElementById('btn');
        //获取div
        var o_div = document.getElementById('box');
        //添加事件
        o_btn.onclick = function(){
            //改变div的背景颜色
            o_div.style.backgroundColor = randColor03();
        }
    </script>
</body>
</html>
  1. 封装一个4位验证码的函数(包含数字大写字母小写字母)

    <script>
        /*
        封装一个4位验证码的函数(包含数字大写字母小写字母)
        4位验证码? 循环四次
        包含数字大写字母小写字母? 数组  字符串  下标
        */
        function verificationCode(n){
            //包含的内容
            var str = '0123456789qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM';
            var code = '';
            //n位验证码
            for(var i = 0;i < n;i ++){
                code += str.charAt(Math.floor(Math.random() * str.length));
            }
            return code;
        }
        alert(verificationCode(6));
    </script>
  1. 扁平化数组 如:[1,2,[3,[4,5],[6,7],8],9] [1,2,3,4,5,6,7,8,9]

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /*
        扁平化数组  如:[1,2,[3,[4,5],[6,7],8],9]  [1,2,3,4,5,6,7,8,9]
        1. 不知道里面有多少层数组,也就不知道嵌套多少层循环,这时候,使用递归解决

        instanceof : 检测当前对象是否属于某一个类返回布尔
        */
        // [1,[2,3]]    [1,2,3]
        function delayering(data){ //data : 数据
            //准备一个新数组
            //1.2.1
            var list = [];
            //1. 判断data 是否为数组
            if(data instanceof Array){
            //如果data是数组,返回true
                //遍历数组
                //1.1
                for(var i = 0,len = data.length;i < len;i ++){
                    list = list.concat(delayering(data[i]));
                }
            }else{ //如果data不是数组,返回false,执行else
                //不是数组的这个元素,给它添加到一个新数组中
                //1.2
                list.push(data);
            }
            //返回新数组
            //2
            return list;
        }

        console.log(delayering([1,[2,3]]));
        console.log(delayering([1,2,[3,[4,5],[6,7],8],9]))
            data = [1,[2,3]]
            var list = [1,2,3];
            list = list.concat(delayering(1)); [1]
            list = list.concat(delayering([2,3])); [2,3]
            return list; [1,2,3]

            data = 1
            var list = []
            list.push(1);  [1]
            return [1]

            data = [2,3]
            var list = [2,3];
            list = list.concat(delayering(2)); [2]
            list = list.concat(delayering(3)); [3]

            return [2,3]

            data = 2
            var list = [];
            list.push(2);  [2]
            return [2];

            data = 3
            var list = [];
            list.push(3);  [3]
            return [3];
    </script>
</body>
</html>

计时器

  1. timer = setInterval(函数,毫秒数) : 间歇性计时器

  • clearInterval(timer) : 取消计时器

  1. timer = setTimeout(函数,毫秒数) : 一次性计时器、延时器、定时器

  • clearTimeout(timer);

Date对象

如何创建日期对象?

  1. var date = new Date();

  2. var date = new Date(2002,2,5); //0~11

  3. var date = new Date(2002,2,5,18,30,50); //0~11

  4. var date = new Date('2002-3-5'); //1~12

  5. var date = new Date('2002-3-5 18:30:50'); //1~12

  6. var date = new Date('2002/3/5'); //1~12

  7. var date = new Date('2002/3/5 18:30:50'); //1~12

如何访问日期对象中的信息?

  1. date.getFullYear() //年

  2. date.getMonth() //月 0~11

  3. date.getDate() //日

  4. date.getDay() //星期

  5. date.getHours() 时

  6. date.getMinutes() 分

  7. date.getSeconds() 秒

  8. date.getMilliseconds() 毫秒

  9. date.getTime() 时间戳

如何设置日期对象中的信息?

  1. date.setFullYear() 年

  2. date.setMonth() 0~11

  3. date.setDate() 日

  4. date.setHours() 时

  5. date.setMinutes() 分

  6. date.setSeconds() 秒

  7. date.setMilliseconds() 毫秒

  8. date.setTime() 时间戳

如何以本地格式的字符串输出日期对象?

  1. date.toLocaleString() 本地格式的日期时间字符串

  2. date.toLocaleDateString() 本地格式的日期字符串

  3. date.toLocaleTimeString() 本地格式的时间字符串

案例

  1. 求出自己已生活了多少天零多少小时零多少分钟零多少秒钟?

    <script>
        //求出自己已生活了多少天零多少小时零多少分钟零多少秒钟?
        // 1天 = 24小时
        // 1小时 = 60分
        // 1分 = 60秒
        // 1秒 = 1000毫秒
        //1. 获取当前的日期时间
        var now = new Date();
        //2. 生日
        var birthday = new Date('1984/3/5 18:30:50');
        //3. 求两个时间的差值
        // var minus = now - birthday; //毫秒数
        var minus = Math.floor((now.getTime() - birthday.getTime()) / 1000); //秒
        //4. 求天数
        var date = Math.floor(minus / 60 / 60 / 24);
        //5. 求小时
        var hours = Math.floor((minus - date * 24 * 60 * 60) / 60 / 60);
        //6. 分钟
        var minutes = Math.floor((minus - date * 24 * 60 * 60 - hours * 60 * 60) / 60);
        //7. 秒
        var seconds = minus % 60;
        console.log(date + '天' + hours + '时' + minutes + '分' + seconds + '秒');
    </script>
  1. 写出距当前日期7天后的日期时间(注,使用日期对象的方法实现,不允许自己计算)

   <script>
        //写出距当前日期7天后的日期时间(注,使用日期对象的方法实现,不允许自己计算)
        // date  date.setDate(date.getDate() + 7)
        function nDaysAfter(n){
            var date = new Date(); //创建日期对象
            //设置当前的日 ( 当前的日期 + 指定的天数)
            date.setDate(date.getDate() + n);
            return date;
        }
        console.log(nDaysAfter(3).toLocaleString());
        console.log(nDaysAfter(7).toLocaleString());
    </script>
  1. 数码时钟

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .sp{
            font-size: 100px;
            color: red;
        }
    </style>
</head>

<body>
    <div id="time">
        <img src="img/0.jpg" alt="">
        <img src="img/0.jpg" alt="">
        <span class="sp">:</span>
        <img src="img/0.jpg" alt="">
        <img src="img/0.jpg" alt="">
        <span class="sp">:</span>
        <img src="img/0.jpg" alt="">
        <img src="img/0.jpg" alt="">
    </div>
    <script>
        /*
        document.querySelectorAll(选择器) : 通过选择器获取所有的元素。返回一个伪数组(类数组)
        伪数组(类数组):
            1. 与数组相同的地方:都可以通过下标访问。都有length属性
            2. 与数组不同的地方:伪数组没有数组的方法。
        */
        //一、获取页面元素
        //获取div#time中所有的img
        var o_img = document.querySelectorAll('#time>img');
    setInterval(function(){
        //二、获取当前本地时间
        //1. 创建日期对象
        var date = new Date();
        //1.1 获取时
        var hours = date.getHours();
        //1.2 获取分
        var minutes = date.getMinutes();
        //1.3 获取秒
        var seconds = date.getSeconds();
        //2. 将时分秒三段数字分解为6个数字并存在一个数组中
        // 11  2
        var arr = [
            hours < 10 ? 0 : Math.floor(hours / 10), hours % 10,
            minutes < 10 ? 0 : Math.floor(minutes / 10),minutes % 10,
            seconds < 10 ? 0 : Math.floor(seconds / 10),seconds % 10
        ]
        console.log(arr);
        //3. 将图片中的src地址更改为当前时间对象的数字
        //遍历伪数组
        for(var i = 0,len = o_img.length;i < len;i ++){
            o_img[i].src = 'img/' + arr[i] + '.jpg';
        }
    },1000)
    </script>
</body>

</html>
  1. 倒计时

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input type="text" name="" id="hours">:
    <input type="text" name="" id="minutes">:
    <input type="text" name="" id="seconds">
    <script>
        //获取元素
        var o_hours = document.getElementById('hours');
        var o_minutes = document.getElementById('minutes');
        var o_seconds = document.getElementById('seconds');
        //倒计时
    var timer = setInterval(function(){
        //1. 现在时间
        var now = new Date();
        //2. 两点到期
        var date = new Date('2022/12/9 14:00:00');
        //3. 求时间差
        var minus = Math.floor((date.getTime() - now.getTime()) / 1000);
        //4. 求小时
        var  hours = Math.floor(minus / 60 / 60);
        //5. 求分
        var minutes = Math.floor((minus - hours * 60 * 60) / 60);
        //6. 求秒
        var seconds = minus % 60;
        console.log(hours + ':' + minutes + ':' + seconds);
        o_hours.value = hours;
        o_minutes.value = minutes;
        o_seconds.value = seconds;
        //7. 倒计时的停止条件
        if(hours === 0 && minutes === 0 && seconds === 0){
            clearInterval(timer);
            alert('倒计时结束!');
        }
    },1000)
    </script>
</body>
</html>

简单的代码异步执行机制

同步:按步骤执行

异步:同时进行

  1. 计算机程序执行分为同步执行,和异步执行:

所谓的异步执行,是一种特殊的程序的执行方式,常见的异步程序有:

定时器(setInterval),延时器(setTimeou),各种事件的绑定(onclick......),ajax请求

  1. 异步程序的执行过程

    1. 从第一行代码开始执行

    2. 同步程序开始执行

    3. 遇到异步程序了,暂时不执行,将异步程序暂时存储在“异步池”中

    4. 所有的同步程序执行完毕

    5. 开始执行“异步池”中的异步程序

      • 若有设定了时间的程序,就会先执行到点了的程序

      • 若有设定的时间是相同的程序,则依照书写顺序执行

setTimeout(function(){ 
    console.log('我是异步执行的程序1'); 
} , 2000);
setTimeout(function(){ 
    console.log('我是异步执行的程序2'); 
} , 1000);
console.log('我是同步执行的程序')
​
//结果依次是:
//我是同步执行的程序
//我是异步执行的程序2
//我是异步执行的程序1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/212146.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu22.04离线手动安装openstack yoga和ceph quincy

目录 写在前面材料准备一. OpenStack部1. 创建虚拟网络和虚拟机2. 配置离线环境3. 环境准备3.1 配置网络3.2 配置主机名并配置解析3.3 时间调整3.4 安装openstack客户端3.5 安装部署MariaDB3.6 安装部署RabbitMQ控制节点操作3.7 安装部署Memcache控制节点操作 4. 部署配置keyst…

etlbox.3.1.0 for NET 轻量级 ETL数据集成库 Crack

适用于 .NET 的轻量级 ETL&#xff08;提取、转换、加载&#xff09;工具箱和数据集成库 高度可定制 厌倦了使用几乎不可能实现复杂需求的用户界面&#xff1f;使用 ETLBox&#xff0c;可以轻松编写适合您独特需求的代码。插入您自己的逻辑或修改现有行为以满足您的特定要求。 …

SpringCloud Gateway

目录 一、gateway简介二、gateway快速入门2.1 引入依赖2.2 编写启动类2.3 编写基础配置和路由规则 三、断言工厂四、过滤器工厂4.1 路由过滤器的种类4.2 请求头过滤器4.3 默认过滤器 五、全局过滤器5.1 全局过滤器作用5.2 自定义全局过滤器5.3 过滤器执行顺序 六、跨域问题6.1 …

思维导图应用程序:iThoughts 6.5 Crack

为什么选择 iThoughts&#xff1f; 有很多思维导图应用程序。他们中的许多人都非常好。那么您为什么要考虑 iThoughts&#xff1f; 免责声明&#xff1a;我创建了 iThoughts - 这是我过去 12 年的生活 - 我有点偏见&#xff01; 大多数思维导图应用程序都提供相同的基本功能级…

【每日OJ —— 572. 另一棵树的子树】

每日OJ —— 572. 另一棵树的子树 1.题目&#xff1a;572. 另一棵树的子树2.解法2.1.算法讲解2.2.代码实现2.3.提交通过展示 1.题目&#xff1a;572. 另一棵树的子树 2.解法 2.1.算法讲解 通过深度优先遍历&#xff0c;来判断二叉树root的每个节点的值是否和subRoot的每个节点…

微服务实战系列之MemCache

前言 书接前文&#xff0c;马不停蹄&#xff0c;博主继续书写Cache的传奇和精彩。 Redis主要用于数据的分布式缓存&#xff0c;通过设置缓存集群&#xff0c;实现数据的快速响应&#xff0c;同时也解决了缓存一致性的困扰。 EhCache主要用于数据的本地缓存&#xff0c;因无法保…

git-6

1.如何用project管理issue&#xff1f; 用project看板管理issue 有五种类型&#xff1a;None、Basic kanban、Automated kanban、Automated kanban with reviews、Bug triage 首先选用Bug triage 利用看板就会很直观&#xff0c;很便捷&#xff0c;Issues也支持&#xff0c;有…

一文搞懂设计模式之责任链模式

大家好&#xff0c;我是晴天。我们又见面了&#xff0c;本周我们继续学习设计模式&#xff0c;本周将同大家一起学习责任链模式。 场景引入 我们回想一下自己曾经经历过的考学场景&#xff0c;我们是如何一步一步考上大学的&#xff08;为了简化过程只提取核心环节&#xff09…

【超全】React学习笔记 中:进阶语法与原理机制

React学习笔记 React系列笔记学习 上篇笔记地址&#xff1a;【超全】React学习笔记 上&#xff1a;基础使用与脚手架 下篇笔记地址&#xff1a;【超全】React学习笔记 下&#xff1a;路由与Redux状态管理 React进阶组件概念与使用 1. React 组件进阶导读 在掌握了 React 的基…

【halcon】C# halcon 内存暴增

1 读取图片需要及时手动释放 一个6M的图片通过halcon进行加载&#xff0c;大约会消耗200M的内存&#xff0c;如果等待GC回收&#xff0c;而你又在不停的读取图片&#xff0c;你的内存占用&#xff0c;将在短时间内飙升。 2 halcon控件显示图片需要清空。 /// <summary>…

东南大学与OpenHarmony携手共建开源生态,技术俱乐部揭牌成立并迎来TSC专家进校园

11月25日,OpenAtom OpenHarmony(以下简称“OpenHarmony”)项目群技术指导委员会(以下简称“TSC”)与东南大学携手,于东南大学九龙湖校区金智楼一楼报告厅举办了“东南大学OpenHarmony技术俱乐部成立仪式暨OpenHarmony TSC专家进校园”活动。此次盛会标志着OpenHarmony开源社区和…

MATLAB 自抗扰控制 - Active Disturbance Rejection Control

系列文章目录 MATLAB 模型参考自适应控制 - Model Reference Adaptive Control 文章目录 系列文章目录前言一、控制器结构1.1 一阶逼近1.2 二阶逼近 二、指定控制器参数参考 前言 自抗扰控制 (ADRC) 是一种无模型控制方法&#xff0c;适用于为具有未知动态特性以及内部和外部…

【深度学习】Adversarial Diffusion Distillation,SDXL-Turbo 一步出图

代码&#xff1a; https://huggingface.co/stabilityai/sdxl-turbo 使用 SDXL-Turbo 是SDXL 1.0的精炼版本&#xff0c;经过实时合成训练。SDXL-Turbo 基于一种称为对抗扩散蒸馏 (ADD) 的新颖训练方法&#xff08;请参阅技术报告&#xff09;&#xff0c;该方法允许在高图像质…

linux防火墙NAT表原理及实操

目录 一、iptables保存规则 1、持久保存iptables规则 2、加载规则 3、开机自动重载规则 二、自定义链 1、创建自定义链 2、修改自定义链名 3、创建规则 4、删除自定义链 三、NAT表 1、SNAT 2、DNAT 一、iptables保存规则 使用iptables命令定义的规则&#xff0c;都…

数据链路层之网桥

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

linux查看进程_静态查看进程_动态查看进程

4.1.3 查看进程 4.1.3.1 静态查看进程&#xff1a;ps ps命令的基本语法如下&#xff1a; ps [options] 参数说明&#xff1a; ps 的参数非常多, 在此仅列出几个常用的参数并大略介绍含义 -A 列出所有的进程 -w 显示加宽可以显示较多的资讯 -au 显示较详细的资讯 -aux 显…

设计模式之道:解构结构型设计模式的核心原理

解构常见的三种结构型设计模式的核心原理 一、引言&#xff1a;如何学习设计模式&#xff1f;二、责任链模式2.1、代码结构2.2、符合的设计原则2.3、案例分析&#xff1a;nginx 阶段处理2.4、小结 三、装饰器模式3.1、代码结构3.2、符合的设计原则3.3、小结 四、组合模式4.1、代…

TLS协议握手流程

浅析 TLS&#xff08;ECDHE&#xff09;协议的握手流程&#xff08;图解&#xff09; - 知乎 前言 通过 wireshark 抓取 HTTPS 包&#xff0c;理解 TLS 1.2 安全通信协议的握手流程。 重点理解几个点&#xff1a; TLS 握手流程&#xff1a;通过 wireshark 抓取 HTTPS 包理解…

【iOS】数据持久化(三)之SQLite3及其使用

目录 数据库简介什么是SQLite&#xff1f;在Xcode引入SQLite APISQL语句的种类存储字段类型 SQLite的使用创建数据库创建表和删表数据表操作增&#xff08;插入数据INSERT&#xff09;删&#xff08;删除数据DELETE&#xff09;改&#xff08;更新数据UPDATE&#xff09;查&…

KEPserver和S7-200SMART PLC通信配置

KEPserver和S7-1200PLC通信配置,请查看下面文章链接: https://rxxw-control.blog.csdn.net/article/details/134683670https://rxxw-control.blog.csdn.net/article/details/134683670 1、OPC通信应用 2、选择Siemens驱动 3、添加S7-200设备