组成
- 风源系统、制动机系统和其他气动辅助装置
- 两节机车组成,每节机车均有完整空气管路与制动系统
惩罚制动
无人警惕作用,超速,监控施加,列车管快速排风,制动系统故障,列车管减压100kPa.
Something just like this
VxWorks内核维护三个队列:tick、Ready、active。
除此之外,还有一个队列涉及任务,即资源等待队列,可以是VxWorks内核提供的,也可以是用户提供,此处为pend队列。
使用taskSpawn
创建一个新的任务,首先创建一个任务控制结构,对其初始化后,加入active队列作为系统任务管理,最后将其加入ready队列,此时才可竞争CPU。
VxWorks将任务分成256个优先级,0是最高优先级,优先级可以在调用taskSpawn
时指定,用户也可以通过调用taskPrioritySet
改变优先级,。
不同于Linux,VxWorks下的任务自始至终都在使用一个栈,即使调用了内核函数,也不存在栈的切换,VxWorks栈的大小在创建时已经确定,之后不能改变,对于一个很多调用的函数,应该在创建时指定一个较大的任务栈。
任务在设计中有一个数据结构包含一个任务运行所需要的所有信息,这些信息称为上下文。
每当时钟前进一个滴答(Tick),操作系统会响应一次中断,该中断为任务调度和定时器的触发点。
使能RR调度接口,整体上仍然是优先级调度,在高有限级存在多个任务运行时,RR调度才有效。1
2
3
4
5STATUS kernelTimeSlice
{
int ticks
}
//循环调度方式,0则禁用,循环时间为ticks*tick S
在启动RR调度后,可以以参数0再次调用来禁用。
1 | STATUS taskPrioritySet |
一个任务在运行过程中需要自己改变自己的优先级,将tid设置为0即可。
1 | STATUS taskLock(void) |
1 | int taskSpawn |
函数返回任务ID,可以通过ID获得TCB(task control block)地址1
2WIND_TCB* tPcb;
tPcb = taskTcb(0); //参数0将返回当前任务的TCB结构地址
使用taskSpawn创建一个任务,马上进入运行状态,有时候需要创建一个任务后进入挂起状态,可以使用taskCreate
,函数参数与taskSpawn
一样,但是需要调用taskActivate
进行激活。1
2
3
4STATUS taskActivate
{
int tid
}
1 | void checkStack |
VxWork支持任意长度任务名,并不要求任务名的全局唯一性,任务名控制在11B以内1
2
3
4
5STATUS taskShow
{
int tid,
int level /*0显示大概信息,1显示详细信息,2显示所有任务信息*/
}
1 | STATUS taskDelete |
当删除一个占用资源没有释放的任务时,可能会导致崩溃。1
2STATUS taskSafe(void)
STATUS taskUnSafe(void)
在一个任务调用了taskSafe以后,在taskUnSafe之前,其他任何任务不能对其进行删除操作。1
2
3STATUS taskSuspend(int tid) /*挂起任务*/
STATUS taskResume(int tid) /*恢复任务*/
STATUS taskDelay(int ticks) /*将正在运行的任务转为睡眠态,使用NO_WAIT作为参数时,VxWorks将当前任务置于ready队列所有相同优先级的任务之后*/
可以使用一个最低优先级的后台任务加上一个任务调度钩子函数实现平台低功耗。当最低优先级后台任务被执行,触发钩子函数,使平台进入低功耗状态。
任务创建钩子函数
1 | STATUS taskCreateHookAdd |
任务调度钩子函数
1 | STATUS taskSwitchHookAdd |
任务删除钩子函数
1 | STATUS taskDeleteHookAdd |
钩子函数查询
1 | void taskCreateHookShow(void) /*显示当前注册到系统的所有在任务被创建时被调用的钩子函数列表*/ |
每个单词的首字母大写其余小写,之间无分隔符。
函数被调用的上级函数的数目。
一个函数直接调用其他函数的数目。
1 | /***************************************************** |
1 | /********************************************************** |
1 | enum Season { Spring, Summer, Fall, Winter}; //声明枚举 |
一般情况下枚举第一个元素对应0,也可显示指定1
enum Season : short { Spring, Summer, Fall, Winter}
枚举的数据类型可以基于8种整数类型
1 | struct Time |
结构主要实现“值”的概念,对于简单的数据使用结构可以节省开销。
1 | //声明一个结构体 |
1 | Time now = new Time(); //调用构造 |
1 | Time now = new Time(12, 30); |
前提是右侧的结构字段都初始化了。
1 | int[] pins; |
数组的大小不是声明的一部分,数组是引用类型。
在声明一个引用类型的时候,不会马上为对象分配内存,只有在用new关键字创建实例的时候,才会真正分配,所以在声明一个数组变量的时候不需要声明它的大小,只有在实际创建数组的时候才可以指定数组的大小。
1 | int[] pins = {9, 3, 7, 2}; |
foreach语句声明了一个循环变量,自动获取数组中每个元素的值,变量类型必须与数组元素类型相匹配。
数组是引用类型,这意味着在复制了一个数组变量得到对同一个数组的两个引用,真实的复制数组需要一个一个赋值。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16//for一个一个赋值
int[] pins = {9, 3, 7, 2};
int[] copy = new int[pins.Length];
for(int i = 0;i<copy.Length;i++)
{
copy[i] = pins[i];
}
//CopyTO方法赋值
pins.CoptTo(copy, 0);
//Copy方法复制
Array.Copy(pins, copy, copy.Length);
//Clone方法复制
int[] copy = (int[])pins.Clone();
以上都为浅拷贝
1 | int[,] items = new int[4, 6];//声明数组,4行6列 |
ArrayList//类似链表
1 | ArrayList number = new ArrayList(); |
Quene
1 | Quene numbers = new Quene(); |
Stack集合类
1 | Stack number = new Stack(); |
Hashtable类
1 | Hashtable ages = new Hashtable(); |
1 | try |
如果一个try抛出异常,但是没有对应的catch处理程序,那么这个方法将立即退出,并返回它的调用方法,如果它的调用方法没有使用try,或者没有找到匹配的catch,那个调用也会退出,返回更上一层。由内向外遍历了所有调用方法之后,假如找不到一个相匹配的catch处理程序,整个程序会终止。
一个异常发生之后,将运行第一个匹配的异常处理程序。
默认情况下C#允许计算悄悄溢出,如果需要,可以启用溢出检查。1
2
3
4
5
6//在checked关键字开头的下面代码块中,任何整数运算溢出,都会抛出一个OverflowException,只会检查代码块中的溢出,如果块中出现方法调用,不会对调用的方法进行检查。
checked
{
int willThow = number++;
Console.WriteLine("sss");
}
unchecked相反,在unchecked块中的语句永远不检查。
1 | try |
finally块中的语句一定会执行,一般用于释放资源。
1 | namespace Classes |
可以把任务封装至静态方法dowork,即可捕捉所有异常。
1 | var anonymousObject = new(Name = "123", Age = 44); |
这个类包含两个Public字段,分别为Name和Age,编译器会根据数据类型进行推断。定义一个匿名类,编译器会为这个类生成一个自己才知道的名称。匿名类只能包含public字段,字段必须全部初始化,而且不能在其中指定方法。
值类型分配内存,引用类型分配地址指向内存,默认传参对象是引用(地址)。
对于值类型,利用C#定义的一个修饰符,将一个变量声明为可空类型。1
2
3
4
5int? i = null; //声明一个可空类型
int j = 99;
int i = 1;
int i = j; //可以将具有恰当形式的表达式赋值给可空类型
j = i; //不可以将一个可空的值赋值给一个普通的值
如果一个参数附加了ref关键字前缀,该参数就会成为实参别名,而不是副本。实参也必须附加ref,使用ref前必须对参数进行初始化。1
2
3
4
5
6
7
8
9static void Inc(ref int param)
{
param++;
}
static void Main()
{
int arg = 42;
Inc(ref arg);
}
out关键字与ref类似,向参数的任何操作也会同时应用于实参,out是对output的简称,在传递一个out参数后,必须在方法内部对其赋值。
object类是所有类型的基类1
2int i = 2;
object o = i;
对于C#来说,一个应用类型都必须引用堆上的数据,在上代码第二行,引用了栈上的i,其实是引用了i在堆上的副本,这种操作为装箱。
1 | object o = 42; |
一个值类型转化为obj类型,那么需要进行强制类型转化,将自动检查obj中的实际类型,不符合会抛出异常。
可以用is操作符验证对象类型:1
2
3
4
5object o = 42;
if(o is int)
{
int i = (int)o;
}
为了代码的健壮性,在强制类型转换之前可以先判断是否是所需要的类型。
1 | object o = 42; |
指针的管理很容易出问题,C#通过引用来解决,如果要使用指针,必须将代码标记为unsafe(不安全)1
2
3
4unsafe
{
}
对列车运行全部作业过程或部分作业过程实现自动控制的系统,可以根据列车在线路上运行的客观条件和实际情况,对列车的运行速度及制动方式等状态进行监督、控制和调整。
列车通过获取地面信息和命令,建立控车曲线,控制列车运行,并调整与前行列车之间必须保持的距离。
一般包括地面设备、车载设备、数据传输网络、车地信息传输设备。
保障行车安全、保证运输效率及保证乘客舒适度。
XAML由XML派生而来,所以很多XML中的概念在XAML中通用。
xmlns—-XML-Namespace定义命名空间。1
2
3
4
5
6
7
8
9
10
11
12<Window x:Class="深入浅出WPF.MainWindow" //使用命名空间x中的class
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" //默认命名空间,UI相关程序集
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" //映射前缀为x,的命名空间,语言解析处理相关程序集
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:深入浅出WPF"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
</Grid>
</Window>
这个关键字可以把一个类分拆到多处定义,这样在XAML中解析生成的类就可以和C#中的部分合二为一了。partial机制可以把类的逻辑代码留在.cs中,使用C#实现,把UI分离除去。
WPF的框架是树状的,以
这种树形结构对整个WPF都有非常重要的意义。
1 | <Window x:Class="深入浅出WPF.MainWindow" |
这个Attribute的作用是告诉XAML编译器将XAML标签的编译结果与后台代码指定的类合并。
类具有怎样的访问控制级别。
为这个控件对象创建引用变量,并将对象的Name属性也设置为x:Name的值。
修改引用变量访问级别
通过Key检索资源,可以把重复利用资源
通过x:Key检索资源,如果x:Shared为true则检索的是同一对象,为false则为副本。默认为true。
我国能源大部分依靠煤炭,随着经济发展加快,全国煤电油运全面紧张,大幅提高运输能力迫在眉睫,经过论证列车重量提高到2万t,可大幅提高运输能力。
在上述情况下,中国北车集团大同电力机车专门针对重载运输需要研制生产出了最高试验速度132km/h、最高运行速度120km/h、总功率为10MW的HXD2型大功率交流传动货运电力机车。
2006年和谐型大功率交流传动机车诞生及批量投入使用,标志我国铁路机车行业实现了由直流传动向交流传动的转化,机车技术达到世界先进水平。
采用大功率交-直-交传动方式,牵引电机为交流异步电机;牵引变流器采用IGBT器件;采用先进的车载计算机网络控制系统;重载车体、转向架、车钩与缓冲器、轮轴驱动系统以及计算机控制的制动系统充分满足牵引重载列车的需要;司机室按照人体工程学理论设计;轮轨关系、车网关系、车载通讯信号等系统技术与我国铁路基础设施具有良好的匹配性;电力机车的功率因数大于0.98,谐波含量大幅降低;电力机车传动效率大于0.85,同时采用制动能量反馈电网的再生制动方式,节能效果显著;
株洲电力机车:HXD1和HXD1b
大同电力机车:HXD2和HXD2b
大连机车车辆和北京二七轨交交通装备:HXD3
大连机车车辆和:HXD3b和HXN3内燃
戚墅堰机车:HXN5
针对铁路重载运输而设计。适用于国内大部分线路情况,完全满足国内铁路气候,和煤尘污染严重的环境要求。机车材料在-40低温条件下仍有良好韧性。
机车采用交-直-交电传动系统、25kV/50Hz的电压制式,可实现单机牵引1万t重载列车,通过远程重联可实现双机牵引2万t重载组合列车的运行模式。
在机车的标准配置中,机车整备重量为184t,对应轴重23t,加上压车铁达到25t,机车整备重量为200t。
HXD2采用2(B0-B0)轴式(即两台机车,每台两个转向架,转向架为2轴,单独驱动)
参考P9
参考P11
微机网络控制系统以一节机车为一个单元,包括2组主处理单元MPU1和MPU2,2组远程输入输出模块RIOM1和RIOM2,4组牵引控制单元TCU1~TCU4,两组辅助控制单元ACU1和ACU2,两组司机显示单元DDU1和DDU2,1组制动控制单元BCU组成。
车辆级通信使用该网络,主要有主处理单元MPU、远程输入输出模块RIOMcar、牵引控制单元TCU、辅助控制单元ACU、制动控制单元BCU、司机显示单元DDU。
每节列车的FIPV采用两路介质冗余设置,以保证网络通信的正常。
FIPV网的接入只有总线仲裁器管理。交换信息包括周期性变量和非周期信息。
有冗余设计:
除了CRC校验,还有数据状态。
P185
1 | float variable; |
如果忘记添加F后缀,那么0.42被视为一个double,在C#中不通过其他方式不能将一种类型变量赋值给另外一种。
textbox内值为字符串
1 | //拼接43和1,得到431 |
1 | int num = int.Parse(str); //将字符串解析为int数据 |
1 | var num = 99; |
只有初始化变量时才能使用关键字var
1 | #region "名称" |
1 | void optMethod(int arg1, double arg2); |