精华内容
下载资源
问答
  • 时间控制器NSTimer可以实现定时器功能,即每隔一定时间执行具体函数,可以重复也可以只执行一次。 class DownloadManagerTableTableViewController: UITableViewController { var timer : NSTimer? override ...
    <span style="font-size:18px;">时间控制器NSTimer可以实现定时器功能,即每隔一定时间执行具体函数,可以重复也可以只执行一次。</span>
    
    class DownloadManagerTableTableViewController: UITableViewController {
        
        var timer : NSTimer?
        
        override func viewDidLoad() {
            super.viewDidLoad()
    
        }
        //页面显示之前设定定时器
        override func viewDidAppear(animated: Bool) {
            super.viewDidAppear(animated)
            self.timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "timerFired", userInfo: nil, repeats: true)
           
        }
        //页面消失后关闭定时器
        override func viewDidDisappear(animated: Bool) {
            super.viewDidDisappear(animated)
            guard let timer = self.timer
                else { return }
            timer.invalidate()
        }
        func timerFired () {
            //print("timer ticked")
            self.tableView.reloadData()
        }
    }

    展开全文
  • Verilog 交通灯控制器

    千次阅读 多人点赞 2019-11-20 15:05:06
    设计一个交通灯控制器,在数码管上以红、黄、绿三种颜色显示当前状态的剩余时间。持续时间分别为:红灯30s,黄灯5s,绿灯30s。初始为红灯,依次变为绿灯、黄灯、红灯循环显示。输入时钟为1k Hz。 系统设计: 分析...

    简介:
    设计一个交通灯控制器,在数码管上以红、黄、绿三种颜色显示当前状态的剩余时间。持续时间分别为:红灯30s,黄灯5s,绿灯30s。初始为红灯,依次变为绿灯、黄灯、红灯循环显示。输入时钟为1k Hz。
    系统设计:
    分析需求,可将交通控制器系统划分为generate_1s、controller、counter、splitter和decoder5_7共五个模块实现。
    交通灯控制器顶层框图如下:
    在这里插入图片描述
    controller状态转移图如下:
    在这里插入图片描述
    Verilog完整代码实现如下:

    /*-------------------------------------------------
    Filename: traffic_light_controller.v
    Function: 交通灯控制器顶层模块(用于综合成实际电路)
    Author: Zhang Kaizhou
    Date: 2019-11-17 14:28:50
    -------------------------------------------------*/
    `include "generate_1s.v"
    `include "counter.v"
    `include "controller.v"
    `include "splitter.v"
    `include "decoder5_7.v"
    module traffic_light_controller(sys_clk, reset, data_high, data_low, state);
    	//输入输出端口定义
    	input sys_clk, reset;
    	output [1 : 0] state;
    	output [6 : 0] data_high, data_low;
    	
    	//内部寄存器及连线定义
    	wire count_clk;
    	wire [6 : 0] data;
    	wire [3 : 0] data_shi, data_ge;
    	
    	//逻辑实现
    	generate_1s		generate_1s_m0(.sys_clk(sys_clk), .reset(reset), .y(count_clk));
    	counter			counter_m0(.count_clk(count_clk), .reset(reset), .data(data));
    	controller		controller_m0(.clk(count_clk), .reset(reset), .din(data), .state(state));
    	splitter		splitter_m0(.data(data), .data_shi(data_shi), .data_ge(data_ge));
    	decoder5_7		decoder5_7_m0(.reset(reset), .data_shi(data_shi), .data_ge(data_ge), .data_high(data_high), .data_low(data_low));
    endmodule
    
    /*--------------------------------------
    Filename: generate_1s.v
    Function: 将1kHz系统时钟分频产生1Hz时钟
    Author: Zhang Kaizhou
    Date: 2019-11-17 14:28:56
    --------------------------------------*/
    module generate_1s(sys_clk, reset, y);
    	//定义输入输出端口
    	input sys_clk, reset;
    	output y;
    	
    	//内部寄存器定义
    	reg y;
    	reg [9 : 0] cnt;
    	
    	//逻辑实现
    	always@(posedge sys_clk or negedge reset)
    	begin
    		if(!reset)
    		begin
    			y <= 1'b0;
    			cnt <= 10'd0;
    		end
    		else
    		begin
    			if(cnt == 10'd999)
    			begin
    			y <= 1'b1;
    			cnt <= 10'd0;
    			end
    			else
    			begin
    				y <= 1'b0;
    				cnt <= cnt + 1;
    			end
    		end
    	end
    endmodule
    
    /*---------------------------------------------
    Filename: counter.v
    Function: 7位循环减计数器(用于倒计时和状态转移)
    Author: Zhang Kaizhou
    Date: 2019-11-17 14:29:01
    ---------------------------------------------*/
    module counter(count_clk, reset, data);
    	//输入输出端口定义
    	input count_clk, reset;
    	output [6 : 0] data; //64~35, 34~5, 4~0循环减计数
    	
    	//内部寄存器定义
    	reg [6 : 0] data;
    	
    	//逻辑实现
    	always@(posedge count_clk or negedge reset)
    	begin
    		if(!reset) data <= 7'd64; //异步复位
    		else if(data == 7'd0) data <= 7'd64;
    		else data <= data - 7'd1;
    	end
    endmodule	
    
    /*-------------------------------------------------
    Filename: controller.v
    Function: 整个电路的控制模块(用FSM实现)
    Author: Zhang Kaizhou
    Date: 2019-11-17 14:29:06
    -------------------------------------------------*/
    module controller(clk, reset, din, state);
    	//定义输入输出端口
    	input clk, reset;
    	input [6 : 0] din;
    	output [1 : 0] state;
    	
    	//内部寄存器定义
    	reg [1 : 0] state, current_state, next_state;
    	
    	//状态编码
    	parameter red = 2'b00, green = 2'b01, yellow = 2'b10;
    	
    	//时序逻辑实现状态转移
    	always@(posedge clk or negedge reset)
    	begin
    		if(!reset) current_state <= red;
    		else current_state <= next_state;
    	end
    	
    	//组合逻辑实现转移条件判断
    	always@(current_state or din)
    	begin
    		case(current_state)
    			red: next_state = (din == 7'd35) ? green : red;
    			green: next_state = (din == 7'd5) ? yellow : green;
    			yellow: next_state = (din == 7'd0) ? red : yellow;
    		endcase
    	end
    	
    	//组合逻辑实现输出
    	always@(current_state)
    	begin
    		case(current_state)
    			red: state = 2'b00;
    			green: state = 2'b01;
    			yellow: state = 2'b10;
    		endcase
    	end
    endmodule
    
    /*------------------------------------------------------------
    Filename: splitter.v
    Function: 将输入的7位二进制数转换成2个4位的BCD码(分离十位和个位)
    Author: Zhang Kaizhou
    Date: 2019-11-17 14:29:10
    ------------------------------------------------------------*/
    module splitter(data, data_shi, data_ge);
    	//输入输出端口定义
    	input [6 : 0] data;
    	output [3 : 0] data_shi;
    	output [3 : 0] data_ge;
    	
    	//内部寄存器定义
    	reg [3 : 0] data_shi, data_ge;
    	reg [6 : 0] data_display;
    	
    	//显示数据转换
    	always@(data)
    	begin
    		if(data >= 7'd35) data_display = data - 7'd35;
    		else if(data >= 7'd5) data_display = data - 7'd5;
    		else data_display = data;
    	end
    	
    	//用左移加3法将7位二进制数转换为两个4位的BCD码
    	integer i;
    	always@(data)
    	begin
    		data_shi = 4'd0;
    		data_ge = 4'd0;
    		
    		for(i = 6; i >= 0; i = i - 1)
    		begin
    			if(data_ge >= 4'd5) data_ge = data_ge + 4'd3;
    			if(data_shi >= 4'd5) data_shi = data_shi + 4'd3;
    		
    			data_shi = data_shi << 1;
    			data_shi[0] = data_ge[3];
    			data_ge = data_ge << 1;
    			data_ge[0] = data_display[i];
    		end
    	end
    endmodule
    
    /*------------------------------------------------
    Filename: decoder5_7.v
    Function: 将4位BCD码数据转换为7段数码管的显示数据
    Author: Zhang Kaizhou
    Date: 2019-11-17 14:29:16
    ------------------------------------------------*/
    module decoder5_7(reset, data_shi, data_ge, data_high, data_low);
    	//输入输出端口定义
    	input reset;
    	input [3 : 0] data_shi, data_ge;
    	output [6 : 0] data_high, data_low;
    	
    	//内部寄存器定义
    	reg [6 : 0] data_high, data_low;
    	
    	//译码个位数
    	always@(reset or data_ge)
    	begin
    		if(!reset)
    		begin
    			data_high <= 7'b0000110; //7'h06
    			data_low <= 7'b0000001; //7'h01
    		end
    		else
    		begin
    			case(data_ge)
    				4'd0: data_low <= 7'b0000001; //7'h01
    				4'd1: data_low <= 7'b1001111; //7'h4f
    				4'd2: data_low <= 7'b0010010; //7'h12
    				4'd3: data_low <= 7'b0000110; //7'h06
    				4'd4: data_low <= 7'b1001100; //7'h4c
    				4'd5: data_low <= 7'b0101100; //7'h2c
    				4'd6: data_low <= 7'b0100000; //7'h20
    				4'd7: data_low <= 7'b0001111; //7'h0f
    				4'd8: data_low <= 7'b0000000; //7'h00
    				4'd9: data_low <= 7'b0000100; //7'h04
    				default: data_low <= 7'b0110000; //7'h48
    			endcase
    		end
    	end
    	
    	//译码十位数
    	always@(reset or data_shi)
    	begin
    		if(!reset)
    		begin
    			data_high <= 7'b0000110; //7'h06
    			data_low <= 7'b0000001; //7'h01
    		end
    		else
    		begin
    			case(data_shi)
    				4'd0: data_high <= 7'b0000001; //7'h01
    				4'd1: data_high <= 7'b1001111; //7'h4f
    				4'd2: data_high <= 7'b0010010; //7'h12
    				4'd3: data_high <= 7'b0000110; //7'h06
    				default: data_high <= 7'b0110000; //7'h48
    			endcase
    		end
    	end
    endmodule
    
    /*---------------------------------------------------------
    Filename: top_t.v
    Function: 交通灯控制器整个系统的顶层测试文件(用于仿真测试)
    Author: Zhang Kaizhou
    Date: 2019-11-17 14:29:23
    ---------------------------------------------------------*/
    `timescale 1ms/100us
    `define sys_clk_half_period 0.5 //系统时钟频率为1kHz,其半周期为0.5ms
    `include "generate_1s.v"
    `include "counter.v"
    `include "controller.v"
    `include "splitter.v"
    `include "decoder5_7.v"
    module top_t(data_high, data_low, state);
    	//输入输出端口定义
    	output [1 : 0] state;
    	output [6 : 0] data_high, data_low;
    	
    	//内部寄存器及连线定义
    	reg sys_clk, reset;
    	wire count_clk;
    	wire [6 : 0] data;
    	wire [3 : 0] data_shi, data_ge;
    	
    	//产生测试信号
    	initial
    	begin
    		sys_clk = 0;
    		#5 reset = 1;
    		#5 reset = 0;
    		#9.5 reset = 1;
    		#120000 $stop; //仿真120s停止
    	end
    	
    	//产生1kHz的系统时钟sys_clk
    	always #`sys_clk_half_period sys_clk = ~sys_clk;
    	
    	//结构描述
    	generate_1s		generate_1s_m0(.sys_clk(sys_clk), .reset(reset), .y(count_clk));
    	counter			counter_m0(.count_clk(count_clk), .reset(reset), .data(data));
    	controller		controller_m0(.clk(count_clk), .reset(reset), .din(data), .state(state));
    	splitter		splitter_m0(.data(data), .data_shi(data_shi), .data_ge(data_ge));
    	decoder5_7		decoder5_7_m0(.reset(reset), .data_shi(data_shi), .data_ge(data_ge), .data_high(data_high), .data_low(data_low));
    endmodule
    

    ModelSim10.4仿真结果:
    在这里插入图片描述
    总结:
    由上面的仿真结果可知,本次设计的交通灯控制电路实现了,在输入1kHz时钟的驱动下,在数码管上以红、黄、绿(状态编码分别为2’d0、2’d1、2’d2)三种颜色显示当前状态的剩余时间。持续时间分别为:红灯30s,黄灯5s,绿灯30s。初始为红灯,依次变为绿灯、黄灯、红灯循环显示。相应的数码管驱动数据也正确。完成了设计预期。

    展开全文
  • 手动调整域控制器之间的复制时间

    千次阅读 2016-07-13 16:15:36
    站点内的域控制器之间的复制默认为每小时4次,管理员可以根据需要调整复制的时间,或者可以设置在某个时间段内不允许复制。在域控制器上打开“AD站点和服务”, 并展开NTDS Settings,如下图,650) this.width=650;...

    站点内的域控制器之间的复制默认为每小时4次,管理员可以根据需要调整复制的时间,或者可以设置在某个时间段内不允许复制。在域控制器上打开“AD站点和服务”, 并展开NTDS Settings,如下图,

    wKiom1PaBeuBu4RyAAGCcFFfDTo937.jpg

     

    右击右侧的“〈automatically generated〉” 选择“属性”,再选择“Change Schedule”,如下图,

     

    wKioL1PaB6ej0Z7dAAG3Uba748M930.jpg

     

    然后就可以选择每小时复制的次数和某个时间段不允许复制了,如下图,

     

    wKiom1PaBvbSUJsUAAK3jeXwL0Y243.jpg

     

    欢迎大家留言和交流,谢谢!

     

    本文出自 “老英的微软博客” 博客,请务必保留此出处http://zyliday.blog.51cto.com/760700/1533367

    展开全文
  • 工业机器人控制器

    万次阅读 多人点赞 2019-06-08 13:36:08
     本文介绍了工业机器人(包括机械臂和移动机器人)的控制系统架构,主要面向机器人控制器开发人员和感兴趣并希望了解更细节的用户。  机械臂控制器 移动机器人控制器  1. 机械臂控制器   机械臂类的控制...

    编辑中未完成,先不要转载……

    工业机器人控制器调研

    初稿完成于 2019-6-8
    robinvista2@gmail.com
      

      如同大脑之于人一样,控制器也是机器人最重要的元部件,它定义了机器人的功能和行为。很多学者都对其进行了研究或给出了设计方案 [ 1 , 2 , 3 ] ^{[1,2,3]} [1,2,3],但是针对控制器总体架构和具体实现的讨论较少,而且与工业生产一线严重脱节,早已过时。本文比较了机械臂和移动机器人两种工业机器人的控制器方案,对其功能需求和特点进行了分析,并探讨开放式控制器的实现方案。

     
      机械臂控制器                     移动机器人控制器
      以上分类的依据是机器人类型。目前市面上更多的控制器产品是通用型运动控制器或运动控制卡,即控制各种非标设备运动的,例如数控机床、激光切割机等自动化设备。当然这些产品也可以通过二次开发用于控制机器人。
    通用运动控制器产品

    1 软硬件方案

      我们首先考察常见工业机器人控制器的软硬件方案。

    1.1 机械臂

      机械臂控制器的发展较早,产品相对成熟,其实现方案见下表。国际一线品牌大多采用X86芯片,并采用实时操作系统构造底层软件。

    厂家硬件操作系统
    ABBx86VxWorks
    KUKAx86VxWorks+Windows(VxWin)
    KEBAx86VxWorks
    B&Rx86Windows 10/B&R Linux 9
    固高x86Windows CE
    MUJINx86
    纳博特x86VxWorks 或 Linux(PREEMPT_RT)或 SylixOS

    1.2 移动机器人

      移动机器人的控制器属于较新的方向,AGV、无人机、工程机械等都可归于此类,最近比较火的无人驾驶也可以认为是一种移动机器人,其控制系统底层方案见下表。

    厂家硬件操作系统软件外部接口
    HesmorInfineon XC167CoDeSysCAN
    HirschmannPowerPCCoDeSysCAN
    EPECInfineon C166CoDeSysCAN
    NDCARM Cortex-A8Linux内置陀螺仪、CAN、WLAN、485
    IFMInfineon TriCore 1796CoDeSysCAN

    1.3 对比

      机械臂的功能要求多,自由度多,而且对运动精度和响应速度的要求较高,比移动机器人一般要高1到2个数量级,因此控制器的计算量大、周期短;移动机器人一般对响应速度要求不高,功能相对简单,其配置相对较低,而且移动机器人通常采用电池供电,控制器内置,因此对功耗和散热有要求,其控制器多采用嵌入式芯片。
      机械臂一般工作于固定的区域,其控制器通常放置于机箱内,因此防护等级不高,一般是IP20;移动机器人由于需要经常运动,尤其是室外工程机械,要考虑防水防尘,其防护等级较高,一般是IP65。

    机械臂移动机器人
    控制精度0.01~0.5mm1~20mm
    控制周期100us~10ms10ms~100ms
    插补需要不需要
    轨迹规划需要不需要
    逻辑控制需要需要

    2 商业控制器

      介绍几种有代表性的商业控制器方案。

    2.1 CoDeSys

      很多机器人控制软件都是借助CoDeSys实现的,那么CoDeSys是什么呢?
      CoDeSys是德国3S公司推出的一款付费的软PLC开发软件,简单来说,它包括两部分:Development System和Runtime System。Development System就是用来编程的软件界面(就像Visual Studio、Eclipse等软件,也可以称为IDE),设计、调试、编译PLC程序都在IDE中进行,这部分是用户经常打交道的;程序写好了以后,就要把它转移到硬件设备中执行。可是这时生成的PLC程序自己是无法运行的,它还要在一定的软件环境中才能工作,这个环境就是Runtime System(也叫运行核),这部分是用户看不到的。二者安装的位置通常不同,IDE一般安装在用户的开发计算机上,Runtime System则位于起控制作用的硬件设备上,程序通过网线或串口线下载到Runtime中运行。

      CoDeSys在工业控制领域的应用非常广泛,上面提到的很多机器人公司都使用了它的产品,例如KEBA、倍福、固高、台达、广州启帆机器人、新时达机器人。3S公司只卖底层软件,不卖硬件和上层应用程序,应用程序和硬件电路需要由用户自己设计,3S公司负责将Runtime System移植到客户的硬件上。Runtime System可以裸跑在硬件上,但一般是运行在操作系统上,配置操作系统也是客户的工作。如果客户要求,CoDeSys的IDE可以定制,换成客户的logo和外观,这就是为什么你会发现不同厂家的开发平台长得不一样,但风格又比较相似。当然,用户也可以使用其它IDE,例如倍福就使用了Visual Studio,而背后的编译器等内核功能以及函数库仍然采用CoDeSys的方案。CoDeSys的Runtime具有强大的适应性,支持绝大多数的操作系统和芯片类型。

      CoDeSys的IDE部分是免费的,你可以从官网下载体验。真正收费的是运行系统Runtime System以及一系列的通信、运动控制组件。

      CoDeSys采用.Net技术开发,其在设计之初就将功能划分为若干组件模块,例如总线协议栈、可视化界面、运动控制、安全控制等等,用户可以像搭积木一样选购必需的模块搭建自己的系统,最后形成一个定制化的控制软件平台。一些初次接触软PLC的用户可能对这部分感到陌生,但其实这种设计方式非常普遍。举几个例子,MATLAB Simulink的实时工具箱(Real-Time)就是这样的工作方式,用户在Simulink的图形界面里通过拖拽设计控制程序,然后下载到真实的硬件中跑,可以在这里了解。还有像倍福也是这样的使用方式,用户在TwinCAT IDE里进行编程,然后下载到倍福的控制器中,控制器里面其实已经预装了一个Runtime。西门子的STEP7也是一款IDE,它的PLC中也存在一个配套的Runtime。只不过西门子(包括日系PLC)的系统封闭而保密,外人不知道他的系统架构。
      用户编写的PLC程序就像我们电脑里的应用程序,它运行在Runtime System上,而Runtime System又运行在操作系统之上。由于Runtime System位于应用程序和操作系统中间,所以又被称为中间件(Middleware)。简单来说,你可以把中间件看成是由驱动程序、基本的函数库等等模块组成的软件系统。因为这些程序模块主要与硬件或者底层软件打交道,与用户关系不大,所以被组织成了单独的一块。这些软件呈现给用户的是函数调用接口,也就是说你只需要会使用就行了,不用操心具体怎么实现,因为这些是驱动工程师和算法工程师的活儿。当然,大多数时候你也看不到这部分的具体实现,因为它们是以编译后的二进制文件的形式提供给你的,根本无法阅读,你顶多能看到一些头文件,其中只是一些函数和变量定义,没有什么干货。在机器人软件里面,处于同样地位的还有ROS、OROCOS等。
      机器人的控制,像数控机床一样,对实时性有要求,因此我们选择的操作系统最好是实时操作系统(RTOS)。遗憾的是,我们经常用的操作系统都不是实时的,例如Windows和Linux。实时操作系统有两种实现方式:
      1. 放弃通用的操作系统,从底层重新开始设计,代表性的有VxWorks、QNX、WinCE、μC/OS、LynxOS等;这种方式的缺点是所有的任务都是实时的,即使任务本身没有实时的必要,例如网络访问、文件系统访问,因此你得专门开发适用于这种操作系统的应用程序,工作量可能比较大。VxWorks在军事和工业应用较多,例如被应用于战斗机和火箭上。VxWorks留下了一个空白,这就是车载领域,现在这个市场被QNX占据了。
      2. 通过对通用的操作系统打补丁(添加扩展),使其具备实时性,代表性的有Windows RTX、Xenomai、RT Linux、RTAI,这种方式的缺点是,对实时任务的支持(资源)没有第一种方式多;
      考虑到Windows和Linux这两款操作系统的用户较多,CoDeSys推出了相应的实时补丁(RTE),为用户免去了改造的烦恼。想了解更多的CoDeSys Runtime信息可以阅读官方的文档 [ 1 ] [ 2 ] [1][2] [1][2]
      CoDeSys runtime如果不安装在操作系统之上,则需要其自己备有简单的调度程序。CoDeSys自带的调度程序比较简单,有两种 [ 5 ] ^{[5]} [5]
      1 Embedded Scheduler 这种是简单的轮询,一个任务结束前另一个任务不能运行,任务之间不能抢占,实际上这种方式并不是实时的;
      2 Timer Scheduler 为每个任务分配一个定时器,定时触发;
      CoDeSys给机器人厂家开发控制器带来了便利,但是依靠CoDeSys这类商业软件打造自己的控制器产品也存在不少的缺点:
      1 底层算法不公开
      CoDeSys集成的运动控制组件、总线协议栈都是封装好的,用户无法了解其内部细节,也无法针对自己的具体需求进行定制优化,只能简单地调用。用户只能依附于CoDeSys平台,难以形成自己的技术。
      2 功能有限,难以扩展
      现在以机器视觉、人工智能、自动驾驶等为代表的新技术突飞猛进,而工业控制上的很多技术仍然停留在20年前。以移动机器人中的导航场景为例,基于视觉或者激光的导航方法需要采集大量的数据并对其进行处理,其中涉及相当多的矩阵计算。而现在PLC只能进行落后的一维数字计算,难以实现复杂的算法。与人工智能圈子喜欢开源的风格正好相反,工业控制圈子相互封闭,谁都不肯开放自家的函数库,开源函数库很少,就连最基本的滤波算法、矩阵计算都要自己从头开始写。而且,国际标准IEC提供的标准函数太过有限,完全无法适应新的场景,急需扩展。
      3 成本高、难以更新
      商业软PLC成本动不动几十万,这还不包括各种总线通信库、运动控制库、可视化库,这些仍需单独购买,而且需要从售出产品上提成,对于小团队来说成本难以接受。由于完全依赖CoDeSys,客户自己产品硬件的升级换代需要重新定制移植,导致成本增加。这让笔者想起来曾经微软给手机打造的操作系统Windows Phone,微软在移动端是如何一步步作死的呢?其中关键的一条就是向手机厂商收取高额的授权费,可能微软当大爷当惯了,而且更不要脸的是给用户设置障碍,同一款手机系统不能连续升级。

      GEB Automation也推出了与CoDeSys类似的软PLC,支持编程、调试、仿真,面向OEM的产品售价9500美元,比CoDeSys好的是一次性付费不再收取单机提成,可以移植到常用的硬件平台,其IDE基于Eclipse开发。

    2.2 菲尼克斯PLCnext

      2019年菲尼克斯高调推出了新一代PLC,被称为PLCnext技术。PLCnext采用通用的软硬件,例如ARM处理器和RTLinux操作系统,因此其也可视为一个软PLC安装于标准硬件平台之上,而PLCnext在中间层仍然采用了KW的软运行核。由于PLCnext的底层操作系统是Linux,用户可以自己在PLCnext上安装ROS系统以使用其中的机器人算法,目前支持最新的melodic版本。PLCnext还支持C/C++、IEC 61131-3标准PLC语言、Matlab等编程语言,为不同用户开发项目提供了便利。PLCnext底层是一个实时操作系统RTLinux,其上允许客户运行自己的非实时应用程序,并且提供非实时应用程序于PLC实时程序的数据访问接口。开放式PLC是未来的潮流,可以看到PLCnext符合这一趋势,反之如果你用西门子的PLC,想做一点扩展是连门都没有滴。

      菲尼克斯PLCnext的核心技术体现在两个方面:任务执行管理器(ESM)和全局数据管理器(GDS)。菲尼克斯为ESM和GDS申请了专利。
      任务执行管理器确保不同优先级的任务按照正确的优先级和时序运行,并保证低优先级的任务被抢占时数据的一致性。下图是一个简单的例子,其中有两个任务(上面一行是任务1,下面一行是任务2),任务1每5ms运行一次,它的优先级比任务2高,所以在任务2运行过程中会被任务1抢占。

      全局数据管理器负责任务间的通信,也就是交互数据。除了任务之间,每个任务内部可能有不同语言编写的函数模块,它们之间也需要交互数据。全局数据管理保证所有的数据在交换过程中的一致性。同样是上面的例子,任务2从被抢占恢复后,数据应该与被抢占前是一样的(即绿色箭头所示的变量5和8),如果不一样就会出现所谓的“数据不一致”现象,对于实时系统这一般是不允许的。全局数据管理器的作用就是负责数据交换的一致性。

    2.3 KEBA

      KEBA是一家奥地利机器人控制器制造商,其编程和控制软件全部建立在CoDeSys软PLC之上,CoDeSys为KEBA提供了基本的编辑、编译、调试等功能。CoDeSys本身与机器人相关的功能很少,因此机器人涉及的功能和函数是由KEBA开发的,以库的形式在CoDeSys中调用。为了保证实时性,控制器里的CoDeSys Runtime安装在了VxWorks之上。

    2.4 KUKA

      KUKA的新一代控制器称为KR C4,其同样采用了软PLC的方案。该方案由KW公司提供 [ 4 ] ^{[4]} [4],软PLC由IDE部分(被称为Multiprog)和Runtime(被称为ProConOS)组成。ProConOS由C#开发。ProConOS Runtime同样运行在VxWorks之上,它们安装在控制器硬件中,其硬件采用了Intel双核CPU。

      

    2.5 欧姆龙

      欧姆龙(OMRON)推出了“机器人集成控制器”——NJ501-R,将PLC,运动和机器人控制集成在单个控制器中。PLC和机器人的编程语言统一在通用的IEC语言中,这使通常管理PLC的工程师也可以管理机器人。PLC与NC程序在同一个机器上执行,能让多个任务同步。

    2.6 百度自动驾驶计算平台

      百度的Apollo无人车项目推出了无人车自动驾驶专用计算平台——ACU (Apollo Computing Unit)。在网络直播《百度ACU软硬件结合优化的实践经验分享》中介绍了ACU的原理和实现。ACU采用了赛灵思的ZU5芯片,这是一个异构多核SoC处理器,上面集成了CPU(ARM V8核)、FPGA、DDR内存(2GB)、还有一个很小的GPU。

      研发工程师认为算力并不与帧率严格成正比,例如常用芯片的算力是TFLOPS级别的,而内存带宽是GFLOPS级别的,也就是说算力是内存读取速度的1000倍,此时单纯增加算力已经不能提高计算速度,因为内存是这时的瓶颈。   为什么采用这种芯片是和自动驾驶中执行的具体计算任务有关的。自动驾驶中包含多种计算任务,其中最主要的就是人工智能算法,也就是深度学习。深度学习需要的计算量是其它任务的10倍以上,所以必须有强大的计算硬件支持。FPGA是算力最强大的可以执行计算密集型任务,非常适合深度学习这样的任务。虽然深度学习的计算量占总体任务的绝大多数,但是自动驾驶中还有大量的其它任务,例如图像处理、SLAM,它们的计算量不大但是计算时间并不可忽略,这时需要由CPU完成。百度针对深度学习的底层计算进行了很多优化,例如采用8bit INT型数据类型减少计算量(同时不降低准确度),把常用的“多个算子组合”融合成一个,用Average pooling替代Max pooling,采用共享内存实现零拷贝。

    3 开源控制软件

      目前存在一些开源的控制系统方案,例如ROS、Orocos、OpenRTM、Beremiz、OpenPLC、XBotCore、ArmarX、ORCA、AMiRo-OS。
      PLCopen定义了伺服和运动控制的一些标准,包括编程语言、运动控制基础函数块(Function Block)、输入输出接口的参数等 [ 3 ] ^{[3]} [3],但是并没有给出具体的实现代码细节,这个是由各个厂家提供的。

    3.1 ROS

      ROS的前身最早可以追溯到2007年斯坦福大学的博士生Eric Berger和Keenan Wyrobek的工作,主要开发语言是C++。虽然ROS的名字听起来是一个机器人操作系统,但其实它不是。ROS是一个中间件,它安装在真正的计算机操作系统之上。刚开始,ROS有点像一个大杂烩,包括一些通信用的组件、可视化和仿真组件、坐标系管理组件。很多人将ROS描述为软件框架,但笔者尽量避免使用这些抽象而又吓人的名词,因为大多数人并不熟悉机器人软件系统,它容易让本来就稀里糊涂的读者更摸不着头脑。
      ROS提供的功能有:
      1 节点定义和节点间的通信方式:节点是一个应用程序模板,用户将自己的算法代码添加进去,剩下的交给ROS
      2 基本工具:机器人常用的函数库(运动规划、SLAM、逆运动学)、可视化工具、数据记录等机器人开发常用的功能
      3 设备驱动:用户拿到硬件不再需要从零开发,节省时间
      ROS在工业界用的并不多,这一点也不奇怪,因为它在设计之初考虑更多的是通用性和代码重用能力,不太关心可靠性、实时性等。最开始百度公司在其无人驾驶车辆上使用了ROS作为平台,当时的考虑可能是快速完成无人驾驶算法的验证。随后,意识到ROS自身的一些问题,百度无人车团队尝试对其进行改造。但是,他们最终放弃了转而选择重新搭建一套软件——Apollo Cyber RT。
      ROS变得像今天这么火完全出乎设计者的意料,他们并没想到ROS会被用在各种各样的机器人上。中国也有一些人计划设计自己的机器人软件系统,例如上海交通大学中国科学院的micROS。

    3.2 Orocos

      Orocos是一个开源的机器人控制程序开发软件,由比利时鲁汶大学的Herman Bruyninckx及其博士生Peter Soetens开发,编程语言为C++。 Orocos的介绍文档偏软件开发,非程序员不容易读懂。
      Orocos的地位与ROS有些类似,但定位于控制,其位于实时操作系统之上,提供的基本功能包括:生成实时控制程序的工具链(编译器),组件模板、机器人常用基本函数。Orocos替用户解决了模块功能和接口定义、模块间实时通信这些基本功能,借助这些软件模块,用户可以更快速的开发部署自己的应用软件。Orocos既关注上层应用层,也关注底层控制层。与ROS相比,Orocos在设计之初就考虑了实时性。在Peter Soetens的博士论文 [ 4 ] ^{[4]} [4]里,对于实时性的讨论占了很大篇幅。Orocos直接使用了底层操作系统(例如Xenomai)的任务调度模块,因此Orocos必须安装在实时操作系统上才能保证实时性。

    3.3 Beremiz

      Beremiz是一个免费、开源的软PLC控制系统,由法国人Edouard Tisserant开发 [ 4 ] ^{[4]} [4],主要开发语言是Python。出于对传统PLC壁垒森严的不满,Tisserant倡导了开源项目Beremiz,他也是CANfestival的作者。

      Beremiz项目始于2005年,雏形只是一个编辑器,随后其它功能逐渐加入从而形成了一个完整的软PLC开发环境,其功能特点如下:
      1 支持多任务,多任务可配置不同的优先级,任务运行方式可以是周期式或中断触发式
      2 支持ST、梯形图等五种标准PLC编程语言
      3 提供IEC 61131-3标准规定的基本函数(定时器、比较、数学运算、类型转换、位操作、字符串等上百个函数)
      4 可扩展Modbus、CANopen、EtherCAT总线通讯模块(需自己移植到所选平台)
      5 支持C和Python语言,用户可以在PLC中调用C程序或者调用Python程序,也可以在Python中调用C程序
      6 支持仿真,但是不支持在线调试
      7 具有可视化界面(HMI),变量值可直观显示为图表
      Beremiz的工作方式为:用户使用PLC语言编写应用程序,不管用户采用ST语言还是梯形图或者其它PLC语言,Beremiz都将其翻译成C语言,这是由MatIEC组件完成的。随后,gcc编译器将生成的C语言程序与总线通信程序一起编译链接得到二进制目标文件(Linux下是so文件,Windows下则是dll文件)。再之后,二进制目标文件被下载到目标设备上,目标设备上预先安装了runtime,runtime对目标文件进行调用完成相应的控制功能 [ 6 , 7 , 8 , 9 ] ^{[6,7,8,9]} [6,7,8,9]

      Beremiz的IDE和runtime两个部分的开发语言都是Python。只要可以运行Python的操作系都可以运行Beremiz,即其可在Windows、Linux、Mac OS等多种操作系统上运行,当然前提必须得有操作系统。Beremiz的任务调度完全依赖于操作系统,这意味着它的实时性受到操作系统的影响很大,因此最好选择实时操作系统,例如Xenomai、WinCE。
      Beremiz衍生出了一些软件控制方案,例如OpenPLC、KOSMOS,在这些衍生物里更多的功能插件被加了进来,例如运动控制函数、总线通信函数、配置插件。
      选择Python进行开发是因为这种语言简单易用,但是Python在工业控制领域很少使用,因为它无法提供实时性(受内存分配等因素影响)。即便如此, [ 10 ] {[10]} [10]对Beremiz runtime的实时性进行了分析,并与CoDeSys runtime做了对比,结果表明Beremiz的实时性反而还优于CoDeSys。这可能是由于核心程序被翻译成C代码的原因,Python编写的runtime只是负责调用。这篇文章比较了C和用Python调用C的性能,性能差距并不是特别悬殊。
      Beremiz的介绍资料很少,并且其中一部分还是由俄文和法文撰写的,缺少深入探讨内部原理的文献。

    3.4 OpenPLC

      OpenPLC是一个免费开源的软PLC软件系统,它由Beremiz项目衍生而来,由美国阿拉巴马大学博士生Thiago Rodrigues Alves开发 [ 13 ] ^{[13]} [13]

    3.5 对比

      大多数软件将任务的调度交给操作系统,这就带来一个问题:对于通用的操作系统的来说,每个进程基本是相互独立的,而对于机器人应用,任务间通常是相互依赖的,这就造成了操作系统的调度程序无法用于任务有依赖的任务调度。

    4 控制器的开发

      机器人控制器开发涉及的专业众多,需要一个团队完成。精通控制算法的机器人专业的博士对于软件开发可能也一窍不通,看到进程、任务调度、mutex这些计算机名词头大;训练有素的软件工程师对于齐次变换矩阵、旋量这些概念则是一头雾水;除此以外,项目还需要驱动工程师、硬件工程师,还要有工程师懂总线通信、熟悉工艺。如果想找业务能力扎实的员工,就要承担高昂的成本,没有诱惑力的工资是很难留住这些专业人士的。更何况中国的机器人教育其实还是相当落后的,能找到专业能力扎实的员工并不容易。笔者撰写本文的初衷也是为了向各方普及基础知识,铲平知识不对称的大山。
      由于开发机器人控制器成本高而且困难,大部分的厂家会选择在别人的基础上开发。

    4.1 控制器方案的选择

      单处理器还是多处理器?
      早期CPU的计算能力较弱,为了提高运行速度,不得不采用多CPU方案,一些计算量大的任务被剥离出来独占一个CPU。比较有代表性的就是各种控制板卡的方案,例如PMAC、固高。固高的GUC-ECAT控制器单独设计了一个DSP和一个FPGA来执行插补、轨迹规划等任务,另一个CPU一般执行非实时的人机交互,编程开发等任务。如果你拆开固高的机器人控制器,就会发现它有两个计算核心(Intel CPU和 DSP/FPGA),就像游戏电脑会有独立的显卡一样。当然,多一个核总没有坏处,比如NI的机器人控制器roboRIO除了有ARM核还带了一个FPGA,可以想象它的数据采集会比较快。也难怪它被用在了对控制周期和采样速率要求较高的场合,例如MIT的四足机器人(用的是cRIO-9082)。

      随着CPU核心数量增加和计算能力的提升,单CPU的性能越来越强,因此机器人控制器只使用一个CPU就够了,所有的实时和非实时任务都运行在这一个CPU上,由操作系统进行调度。
      操作系统还是裸跑?
      一般认为操作系统会导致额外的开销,毕竟上下文切换需要时间,但是半导体技术和软件技术的进步已经使这个差别非常小了。程序裸跑在硬件上适合比较简单、逻辑不复杂的应用场合,但是其缺点也是显而易见的,如果升级或者改变硬件平台,程序就要重写。所以现在的机器人(尤其是机械臂、无人驾驶汽车)控制器无一例外都使用了操作系统。
      半成品软件还是软PLC?
      ROS和OROCOS是半成品,它们更适合学术研究,需要用户对整个系统比较熟悉才能使用,对用户的编程能力有较高的要求,一般用在产品还没有定型的阶段或者用户不需要经常变换应用任务的场合。例如无人驾驶可以使用,因为无人驾驶的整个业务逻辑和任务基本不会有大的变动。正如手机或者汽车行业,厂家不会把电路板或者底盘直接卖给客户,因为客户不会使用。面向终端客户的产品必须要考虑产品本身的易用性和客户的能力。所以如果你的产品面向的是没有研发能力的终端客户,必须要有规范易用的编程界面和简洁高效的编程语言,这是ROS或OROCOS这种软件所不具备的。
      而软PLC自带IDE,用户可以直接在IDE中直观地编写自己的应用程序。如果自带的函数不够用,用户再去底层实现自己的函数。开发效率更高,使用更友好。因此,现在的机器人控制器都会采用软PLC的实现方式。
      笔者研究生毕业最早接触的机器人控制器不管看起来还是用起来都像个PLC,这让我很恼火。因为PLC是低级的玩意,它的编程语言居然是梯形图这种看起来像小学生比赛一样的东西,而且除了一些基本的函数,其它的什么都没有,做个矩阵计算什么的想都别想。
      是的,PLC编程简单而且皮实耐用,这是它设计的目的,但是机器人正在变得越来越不简单,更多的功能被加入进来,机器视觉、自主导航、运动规划、多轴运动控制,这些要求控制器提供更强大的支撑,而不仅仅是低端的逻辑控制或者简单的数值计算。所以,对于机器人控制来说,传统的硬PLC应该被淘汰了。
      我们需要的控制器软件应该足够开放,允许用户随时调整程序结构、加入新的功能,同时它自身应该提供足够的底层基础函数,例如线性代数、数学优化、插值拟合、方程求解、甚至图像处理、运动控制。在使用方式上,为了兼顾客户(不能要求所有客户都能自己开发高级功能),它还是尽量简单好,最好与PLC的使用差别不大。

    4.2 实时性

      开发机器人控制器是个繁重的工作,要明确一系列性能要求,首先就是实时性。
      如果问PLC或者机器人控制器与普通计算机的本质区别是什么,你会如何回答?是PLC更稳定吗,还是它的抗干扰能力更强、又或者是接口更丰富、或是编程语言更符合工业控制。笔者认为这些都不是,真正本质的区别在于PLC是实时的,而普通计算机不是实时的。家用电脑的信息处理能力可以轻松甩出PLC几条街(想想你玩大型游戏或者看高清视频的计算量),那么为什么工业上还是使用“落后的”PLC呢?答案就是实时性,实时性对于工业机器人来说是必须的(至于服务机器人笔者认为可以不强求)。一般人很容易错把“实时性”理解为计算速度快或者响应延时短,但其实“实时性”表示时间上的“确定性”,例如实时操作系统(RTOS)中的中断响应或者进程切换的延迟时间一定是在一个时间范围内,我们常用的操作系统(Windows、Linux)都不是实时操作系统,因为它们设计的出发点是大吞吐量,不能保证每个事件都在一定范围内得到处理。再比如,标准以太网的传输速度比实时工业以太网(比如EtherCAT)快多了,但是标准以太网却不是实时的,因为它同样不能保证数据在确定的时间内完成传输。
      以上都是定性的描述,能不能定量说明呢?当然了,确定性肯定是有具体指标的,脱离具体数字分析实时性没有意义。如果我们将反应时间规定为1个小时,那么就连Windows这样的操作系统也是实时的了,因为它响应再慢也不会花一个小时。工业上很多场合1个小时显然是太夸张了,我们至少要缩小到10ms这样的量级,例如一个控制或插补周期执行时间不能超过1ms,这样Windows系统肯定满足不了要求。最近炒的比较火的5G通信技术可以将延时控制在1ms左右,虽然它也不是实时的,但是由于速度足够快所以也可以用于工业控制领域取代有线通信,这就是为什么5G这么火的原因。
      理解实时性不太难,但是影响实时性的因素有哪些呢?这方面讨论涉及操作系统原理,各大机器人厂家肯定不会公开自己的测试和试验结果。评价实时性的主要指标是latency和jitter,jitter受到操作系统调度算法的影响很大,其它的例如系统负载也有影响,调度算法的影响大概是十微妙级的。jitter对机器人性能的影响不容易量化,因为中间环节有些复杂(底层伺服闭环)。
      影响实时性的另一个主要因素是内存分配。动态内存的分配耗时非常不确定,这也是为什么很多实时系统都避免采用动态内存。这里我举两个例子:
      1. 在PLC中不提供动态数组,只能用定长数组,也就是说使用之前必须先分配好数组长度。这显然很不方便,例如我们有时在函数调用时传递一个数组,而事先并不想考虑数组的大小。这样一来,我们只好计算好每次传递的数组长度,或者设置一个尽量大的数组,显然这会造成空间的浪费。

      2. 如果你有过在MATLAB Simulink中编写S函数或者用户自定义函数的经历,你就会发现,S函数中要求你在使用变量之前必须先进行定义或分配空间,不能像在m文件中一样不事先定义就赋值(可以看这个MATLAB自带的例子:Integrate MATLAB Algorithm in Model)。因为Simulink中的模块是可以生成C语言并导出到硬件上直接运行的,这意味着它对实时性有要求。一些PLC,例如前面提到的菲尼克斯和倍福,都支持将Simulink中仿真好的控制模型直接生成为控制程序,而无需重新编程。难怪我们在Simulink中编写S函数的时候总感觉不像在MATLAB写程序那么自由随意。

    4.3 高精度定时器

      我们经常提到“实时”,实时需要高精度的时间标准,那么谁来提供这个高精度的时间呢?答案就是时钟周期,它是是实时操作系统的心跳(或者脉搏)。周期性采集数据、任务定时切换、延时输出,这些功能都要求实时操作系统必须要有一个稳定的时钟周期来作为整个系统的时间标准。
      什么是时钟周期呢?时钟周期依赖一个定时器,它是个函数,其本质是一个计数器。定时器开始预先存储一个值,每次硬件(例如晶振)产生一个脉冲,就将这个值减一,减到0时再重置为初始值,同时产生一个中断,这个特定的周期性的中断称为“时钟周期”(Tick,有的也叫“时钟节拍”、“心跳”或“滴答”)。举个例子,假如晶振的频率是72MHz,则时钟周期(Clock Period)就是1/72M,如果预先存储的值是72000,那么时钟节拍就是1/72M × \times × 72000= 0.001s,也就说1ms产生一个中断,此时控制器无法分辨低于1ms的时间间隔。

    5 参考资料
        
    [1] 机器人控制器的现状及展望,范永,谭民,机器人,1999.
    [2] 开放式机器人控制器综述,孙斌,杨汝请,机器人,2001.
    [3] Robotics Middleware: A Comprehensive Literature Survey and Attribute-Based Bibliography,Ayssam Elkady,Journal of Robotics,2012.
    https://zhuanlan.zhihu.com/p/28052497
    [4] CODESYS Control V3 Manual, Document Version 19.0.
    [5] CODESYS Control V3 Migration and Adaptation, Document Version 4.0.
    [6] Robots Count on Software,KW-Software.
    [6] https://www.plcopen.org/technical-activities/motion-control
    [7] A Software Framework for Real-Time and Distributed Robot and Machine Control,Peter Soetens,Ph.D. thesis,2016.
    [8] An Open Source IEC 61131-3 Integrated Development Environment,Edouard Tisserant,IEEE,2007.
    [9] OPC UA support for Beremiz softPLC,Martim Afonso,2018.
    [10] An Open-source Development Environment for Industrial Automation with EtherCAT and PLCopen Motion Control,I. Kim,IEEE ETFA,2013.
    [11] Conception and Implementation of a Secure Engineering and Key Exchange Mechanism for the Open Source PLC Beremiz using a Test Driven Approach,M A Rahman,2016.
    [12] Can We Use Beremiz Real-time Engine for Robot Programmable Logic Controller,S Chu,CACS,2015.
    [13] OpenPLC - A fully open source controller An open source platform for PLC research,https://motion.control.com/thread/1464718978
    [14] OpenPLC: An Open Source Alternative to Automation,Thiago Rodrigues Alves,IEEE Global Humanitarian Technology Conference,2014.
    [15] 工业机器人控制器开放性、实时性分析方法以及单处理器模式下的实现,博士学位论文,谈世哲,2002.
    [16] Bare-Metal, RTOS, or Linux? Optimize Real-Time Performance with Altera SoCs,Chee Nouk Phoon,2014.
    [17] Real-time Operating System Timing Jitter and its Impact on Motor Control,F. M. Proctor,SPIE,2001.

    展开全文
  • 新能源整车控制器VCU开发过程分享

    万次阅读 多人点赞 2017-11-22 09:46:52
    一般车型不一样整车控制器的接口需求也不一样,因为整车控制器开发周期比较长,所以在整车控制器的研发起始阶段要考虑,所研发的整车控制器要有一定的兼容性,能适应较车型。 从输入来看:需要整车设计需求+整车...
  • 中央处理器 —— 硬布线控制器和微程序控制器

    千次阅读 多人点赞 2019-08-10 10:44:41
    一、控制器的结构和功能 运算器是组合逻辑电路(输入),控制器是时序逻辑电路(输入+状态) 控制器是计算机系统的指挥中心,控制器的主要功能有: 1)从主存中取出一条指令,并指出下一条指令在主存中的位置。 2)...
  • MATLAB仿真PID控制器与模糊控制器

    万次阅读 多人点赞 2019-03-04 16:06:10
    摘要:使用matlab编写PID控制器与模糊控制器,并对原理进行解析。 背景: 小白自学。 基础:1、视频“自动控制原理”,1-3章,柠檬大学,点此链接 2、《基于MATLAB的系统分析与设计——模糊系统》,楼顺天等,...
  • 微程序控制器

    千次阅读 2020-04-15 09:46:46
    硬布线控制器 微程序控制器 逻辑 同步时序 存储 速度 快 较慢 修改难度 大 小 适用对象 RISC CISC 微程序控制方式的基本思想 将并发信号事先存储为微指令 一条指令对应个时钟周期 个...
  • cpu控制器

    千次阅读 2015-11-28 20:31:37
    CPU控制器  控制器是整个CPU的指挥控制中心,由指令寄存器IR(InstructionRegister)、程序计数器PC(ProgramCounter)和操作控制器0C(OperationController)三个部件组成,对协调整个电脑有序工作极为重要。 指令...
  • PID控制器

    千次阅读 2013-10-27 12:53:26
    PID控制器是根据PID控制原理对整个控制系统进行偏差调节,从而使被控变量的实际值与工艺要求的预定值一致。不同的控制规律适用于不同的生产过程,必须合理选择相应的控制规律,否则PID控制器将达不到预期的控制效果...
  • 如果我们让这台域控制器直接消失,那么其他的域控制器就无法得知这个消息,每隔一段时间其他的域控制器还会试图和这个域控制器进行 AD 复制,客户机也有可能会把用户名和口令送到这个不存在的域控制器上进行验证。...
  • DMA控制器

    千次阅读 2017-03-17 12:41:02
    (整理,原大部分资料来源于百度) DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU ...ARM处理芯片内部的DMA控制器是一种硬件组件,使用它可将
  • PID控制器开发笔记之二:积分分离PID控制器的实现

    千次阅读 多人点赞 2018-05-10 22:32:47
    前面的文章中,我们已经讲述了PID控制器的实现,包括位置型PID控制器和增量型PID控制器。但这个实现只是最基本的实现,并没有考虑任何的干扰情况。在本节及后续的一些章节,我们就来讨论一下经典PID控制器的优化与...
  • 5.4.3微程序控制器

    千次阅读 2016-10-08 17:17:55
    微程序控制器采用存储逻辑实现,也就是把微操作信号代码化,使每条机器指令转化成为一微程序并存入一个专门的存储器(控制存储器)中。微操作控制信号由微指令产生。 1.微程序控制的基本概念 微程序设计思想就是...
  • PID控制器及其参数整定

    千次阅读 2019-05-22 22:54:57
    本文主要详细分析PIDPIDPID控制器各个环节的作用以及参数整定的一般方法。 PIDPIDPID控制器各环节的作用: PPP:误差的比例项(现在),比例项的引入,时域上来讲可以增加了系统的开环增益和自然频率,使控制系统的...
  • 计算机组成.机器需要控制.控制器CU

    万次阅读 2016-05-25 20:29:28
    控制器部分的内容算是让我对处理器有了更深一步的理解 学到汇编其实还是有些抽象,为什么机器指令就可以直接被机器识别并执行呢? 这才知道,机器指令之下还有微程序,细究起来最不可分的操作应当是微指令,条微...
  • 学会Zynq(28)SPI控制器简介

    千次阅读 多人点赞 2019-03-31 17:57:02
    本文简单介绍Zynq中的SPI控制器。本文将“master”称为“主机”;将“slave”称为“从机”;将“slave slect”从机选择简称为SS。 SPI控制器 Zynq中的SPI总线控制器能够与各种外设通信,如存储器、温度传感器、...
  • jmeter巧用ForEach控制器

    万次阅读 2018-01-16 09:38:41
    段时间做接口自动化的时候遇到很查询接口,接口出参会随着入参type的变化,得到不同type下的数据。 如上图,是接口query_financial_stock的说明。测试时候对入参financial_type分别传入值100301、100302、...
  • Jmeter简单控制器

    千次阅读 2017-09-05 14:33:22
    jmeter中逻辑控制器(Logic Controllers)的作用域只对其子节点的sampler有效,作用是控制采样器的执行顺序。 jmeter提供了17种逻辑控制器,它们各个功能都不尽相同,大概可以分为2种使用类型: ①.控制测试...
  • webots控制器在PyCharm中的配置

    千次阅读 2020-04-06 19:55:13
    文章目录开场废话配置...前段时间有老铁私聊我,问我webots怎么在PyCharm中写py控制器,今天就来跟大家分享分享。 其实主要工作就在于把webots的库文件包含进所用的IDE就ok了~ 配置过程 step 1:PyCharm打开控制器...
  • 控制器组成及其部分原理情况说明

    千次阅读 2017-08-18 13:30:40
    控制器的组成与里面涉及到的知识的总结
  • 可编程中断控制器8259A

    万次阅读 2015-12-06 13:11:38
    可编程中断控制器8259A是Intel公司专为80x86 CPU控制外部中断而设计开发的芯片。 它将中断源优先级判优、中断源识别和中断屏蔽电路集于一体,不需要附加任何电路就可以对外部中断进行管理,单片可以管理8级外部中断...
  • Controller控制器

    千次阅读 2017-06-14 22:37:54
    Controllor组件是LoadRunner的控制中心,主要包括场景设计和场景执行两部分。  在VuGen中编辑完脚本并将脚本加载到Controller组件中,即开始对脚本运行时的场景进行设计,当场景设计完成后,即可执行该场景。  ...
  • 在本系列(六)的博文中我们介绍了部署额外域控制器的意义,同时介绍了如何在线部署额 外域控制器,也就是额外域控制器通过网络以在线方式从复制伙伴那里获取 Act ive Directory 数据。在线部署额外域控制器是我们...
  • jmeter应用---逻辑控制器(二)

    千次阅读 2017-11-29 16:37:33
    Switch Controller(Switch控制器)Switch控制器类似交替控制器,与交替控制器不同的是switch控制器每次迭代运行子节点的其中一个,通过给该控制器中的Value赋值,来指定运行哪个采样器,而不是交替执行。...
  • uglify压缩angular控制器注意

    千次阅读 2016-06-07 22:36:43
    段时间尝试压缩过公司angular控制器js,压缩后js大小几乎都缩小50%以上,但是使用的时候出错了。今天有空整理了下: angularjs是通过控制器构造函数的参数名字来进行依赖注入,压缩控制器js代码,所有的参数也同时...
  • 04控制器-AngularJS基础教程

    千次阅读 多人点赞 2015-04-07 19:10:27
    本系列教程以翻译Chris Smith的Angualr Basics为梗概,融合博主自己的理解,为大家提供一个简单明了的学习教程,通过讲解基础、实用的内容,简化学习进程、降低学习难度。本文为系列教程的第4篇,Angular控制器。...
  • 实现的效果: 1、使用参数picker-options 建议使用参数time-arrow-control,用箭头进行选择(用鼠标滚轮...selectableRange :控制选择的时间段。如果是今天,则时间从此刻开始,否则从0时开始 <el-date-picke...
  • js /** * 点击按钮后时间内按钮不... * 可接受 id 及 class 选择,可同时控制多少个class */ $.fn.setBtnTimer = function(options) { "use strict"; var defaults = { 'time': 60 }; var settings = $.
  • 凯利KAC交流控制器调试方案

    万次阅读 多人点赞 2018-05-02 14:22:03
    凯利KAC交流控制器调试方案(客户版)基础调试一、 安全操作规范(调试之前必看)1. 拆装控制器时,一定要断掉总电,使电池主回路处于断路状态。2. 安装控制器时,一定要检查控制器的B+、B-与电池正、负极接线...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 634,037
精华内容 253,614
关键字:

多段时间控制器