Mars的技术博客

Something just like this


  • Home

  • About

  • Tags

  • Categories

  • Archives

  • Search

HXD1列车制动系统

Posted on 2019-05-06 | In HXD1型电力机车
Words count in article: 78 | Reading time ≈ 1

组成

  • 风源系统、制动机系统和其他气动辅助装置
  • 两节机车组成,每节机车均有完整空气管路与制动系统

惩罚制动

无人警惕作用,超速,监控施加,列车管快速排风,制动系统故障,列车管减压100kPa.

VxWorks开发-任务调度

Posted on 2019-05-05
Words count in article: 0 | Reading time ≈ 1

VxWorks开发-任务

Posted on 2019-05-05 | In VxWorks设备驱动开发详解
Words count in article: 1.7k | Reading time ≈ 6

内核实现基本原理

VxWorks内核维护三个队列:tick、Ready、active。
除此之外,还有一个队列涉及任务,即资源等待队列,可以是VxWorks内核提供的,也可以是用户提供,此处为pend队列。

  • tick队列,调用taskDelay函数后,任务所处的队列,此时任务设置为Delay,无资格竞争CPU。
  • ready队列,有资格竞争使用CPU的所以任务,队列以优先级排序,队列头是除了运行的任务之外,系统中最高优先级的任务
  • active队列,系统中所有运行的任务
  • pend队列,竞争使用资源,资源不可用,进入pend队列

任务创建流程

使用taskSpawn创建一个新的任务,首先创建一个任务控制结构,对其初始化后,加入active队列作为系统任务管理,最后将其加入ready队列,此时才可竞争CPU。

任务优先级

VxWorks将任务分成256个优先级,0是最高优先级,优先级可以在调用taskSpawn时指定,用户也可以通过调用taskPrioritySet改变优先级,。

  • 应用层任务推荐使用100-250之间的优先级
  • 驱动层任务可以使用51-99之间的优先级
  • 网络数据收发任务tNetTask的优先级为50

VxWorks栈

不同于Linux,VxWorks下的任务自始至终都在使用一个栈,即使调用了内核函数,也不存在栈的切换,VxWorks栈的大小在创建时已经确定,之后不能改变,对于一个很多调用的函数,应该在创建时指定一个较大的任务栈。

任务上下文

任务在设计中有一个数据结构包含一个任务运行所需要的所有信息,这些信息称为上下文。

  • 平台CPU内部所有寄存器值
  • 任务运行时暂时存放函数变量以及函数调用时被传递参数的栈
  • 各种定时信息
  • 信号处理函数
  • 其他辅助信息,任务运行总时间,任务最终返回值

VxWorks系统时钟

每当时钟前进一个滴答(Tick),操作系统会响应一次中断,该中断为任务调度和定时器的触发点。

任务操作函数

使能RR调度接口,整体上仍然是优先级调度,在高有限级存在多个任务运行时,RR调度才有效。

1
2
3
4
5
STATUS kernelTimeSlice
{
int ticks
}
//循环调度方式,0则禁用,循环时间为ticks*tick S

在启动RR调度后,可以以参数0再次调用来禁用。

1
2
3
4
5
STATUS taskPrioritySet
{
int tid, //任务id,taskSpawn的返回值,
int newPriority //新设定的优先级
}

一个任务在运行过程中需要自己改变自己的优先级,将tid设置为0即可。

1
2
STATUS taskLock(void)
STATUS taskUnLock(void)
  • taskLock关闭任务调度,taskUnLock开启任务调度,主要保证一段代码的原子性。
  • taskLock不禁止中断,不能在中断上下文保证互斥。
  • 当taskLock因为资源进入阻塞状态,任务调度机制重新工作,直到该任务恢复运行。
1
2
3
4
5
6
7
8
9
10
11
12
13
int taskSpawn
{
char* name, /*可以为NULL,采用默认任务名,‘tN’,N从1开始*/
int priority, /*任务优先级*/
int options, /*任务选项,控制任务的某些行为一般为0*/
int stackSize, /*任务栈的大小,此后不可更改*/
FUNCPTR entryPT, /*任务执行入口函数地址,函数名*/
int arg1,
...
...
...
int arg10 /*入口函数参数,最多10个,多于10个,可以使用指针*/
}

函数返回任务ID,可以通过ID获得TCB(task control block)地址

1
2
WIND_TCB* tPcb;
tPcb = taskTcb(0); //参数0将返回当前任务的TCB结构地址

使用taskSpawn创建一个任务,马上进入运行状态,有时候需要创建一个任务后进入挂起状态,可以使用taskCreate,函数参数与taskSpawn一样,但是需要调用taskActivate进行激活。

1
2
3
4
STATUS taskActivate
{
int tid
}

任务栈

  • VxWorks调度的基本单元是任务,也就是程序的实例
  • 参数存放在栈中,传递参数的机制多用栈
  • VxWorks的任务栈既被应用函数使用,也被内核函数使用
  • 任务栈的大小在创建时就决定了,一般先申请一个很大的栈,然后用试验法调用checkStack确定实际栈
    1
    2
    3
    4
    void checkStack
    {
    int taskNameOrId
    }

任务名

VxWork支持任意长度任务名,并不要求任务名的全局唯一性,任务名控制在11B以内

1
2
3
4
5
STATUS taskShow
{
int tid,
int level /*0显示大概信息,1显示详细信息,2显示所有任务信息*/
}

结束任务

1
2
3
4
STATUS taskDelete
{
int tid //为0结束自己
}

当删除一个占用资源没有释放的任务时,可能会导致崩溃。

1
2
STATUS taskSafe(void)
STATUS taskUnSafe(void)

在一个任务调用了taskSafe以后,在taskUnSafe之前,其他任何任务不能对其进行删除操作。

1
2
3
STATUS taskSuspend(int tid)         /*挂起任务*/
STATUS taskResume(int tid) /*恢复任务*/
STATUS taskDelay(int ticks) /*将正在运行的任务转为睡眠态,使用NO_WAIT作为参数时,VxWorks将当前任务置于ready队列所有相同优先级的任务之后*/

钩子函数–实现底功耗

可以使用一个最低优先级的后台任务加上一个任务调度钩子函数实现平台低功耗。当最低优先级后台任务被执行,触发钩子函数,使平台进入低功耗状态。

  • 任务创建钩子函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    STATUS taskCreateHookAdd
    {
    FUNCPTR createHook /*当一个新任务被创建时调用的钩子函数*/
    }
    void createHook
    {
    WIND_TCB *pNewTcb /*创建钩子函数形式,将会获取新创建的任务的TCB*/
    }
    void taskCreateHookDelete
    {
    FUNCPTR createHook /*注销通过taskCreateHookAdd注册的钩子*/
    }
  • 任务调度钩子函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    STATUS taskSwitchHookAdd
    {
    FUNCPTR switchHook /*注册发生任务调度时调用的钩子函数*/
    }
    void switchHook /*函数原型*/
    {
    WIND_TCB *pOldTcb, /*被调度出去的任务TCB*/
    WIND_TCB *pNewTcb /*抢占了CPU的任务TCB*/
    }
    STATUS taskSwitchHookDelete
    {
    FUNCPTR switchHook /*注销*/
    }
  • 任务删除钩子函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    STATUS taskDeleteHookAdd
    {
    FUNCPTR deleteHook /*注册在任务消亡时被调用的钩子函数*/
    }
    void deleteHook
    {
    WIND_TCB *pTcb /*函数原型*/
    }
    STATUS taskDeleteHookDelete
    {
    FUNCPTR deleteHook /*注销*/
    }
  • 钩子函数查询

    1
    2
    3
    void taskCreateHookShow(void)   /*显示当前注册到系统的所有在任务被创建时被调用的钩子函数列表*/
    void taskDeleteHookShow(void) /*显示当前注册到系统的所有在任务被删除时被调用的钩子函数列表*/
    void taskSwitchHookShow(void) /*显示当前注册到系统的所有在任务被调度时被调用的钩子函数列表*/

C语言编码规范

Posted on 2019-04-29 | In work
Words count in article: 140 | Reading time ≈ 1

驼型

每个单词的首字母大写其余小写,之间无分隔符。

扇入数

函数被调用的上级函数的数目。

扇出数

一个函数直接调用其他函数的数目。

头部文件说明

1
2
3
4
5
6
7
8
9
10
/*****************************************************
*File Name : xx.c
*Copyright : Zhuzhou CSR Times Electric Co.,Ltd. All Rights Reserved.
*Create Date : 2019/4/29
*Description : ....................
*
*REV1.0.0 Xiong 2019/11/28 File Create
*REV1.0.1 LLLL 2019/02/11 Fixed bulk-IN read and poll
*
******************************************************/

函数头部说明

1
2
3
4
5
6
7
/**********************************************************
*Name : UsbSendCR
*Function :
*Para : INT32 arg1, description
* INT32 arg2, description
*REV1.0.0 xiong 2019/4/29 create
*REV1.0.1 xxxx 2019/4/29 Modify packet format

C#从入门到放弃4

Posted on 2019-04-25 | In 编程语言
Words count in article: 937 | Reading time ≈ 4

C#中的枚举

1
2
3
enum Season { Spring, Summer, Fall, Winter}; //声明枚举
Season colorful = Season.fall;
Console.WriteLine(Colorful); //可自动匹配

一般情况下枚举第一个元素对应0,也可显示指定

1
enum Season : short { Spring, Summer, Fall, Winter}

枚举的数据类型可以基于8种整数类型

C#中的结构

1
2
3
4
struct Time
{

}

结构主要实现“值”的概念,对于简单的数据使用结构可以节省开销。

C#中结构和类

  • 不能为结构声明无参构造,编译器会自动生成一个,为所有字段赋值;
  • 在非默认构造中,必须初始化所有字段;
  • 结构中不能声明一个字段时同时进行初始化。
    1
    2
    3
    4
    5
    6
    //声明一个结构体
    struct time
    {

    }
    time t; //C#中不需typedef

构造器初始化

1
2
3
4
Time now = new Time();   //调用构造
Time now; //不调用

//虽然是new出来的,然而依然是值类型,数据在栈上。

Console.WriteLine()自动调用ToString方法

结构复制

1
2
Time now = new Time(12, 30);
Time copy = now;

前提是右侧的结构字段都初始化了。

C#数组

1
2
3
4
5
6
7
8
int[] pins;
pins = new int[4];
pins = new int[4]{9, 3, 2, 1};//大括号力的数值的数量必须和创建的数组实例的大小完全匹配
pins = new int[4]{random%10,random%10,random%10,random%10}; //可以是运行时计算的值
int[] pins = {9, 3, 7, 2}l
Time[] s = {new Time(12, 30), new Time(5, 30)};
var names = new[]{"a", "b", "c"};//隐式推断
var name = new[]{new {Name = "John", Age = 44}}; //数组元素都是匿名类型。

数组的大小不是声明的一部分,数组是引用类型。
在声明一个引用类型的时候,不会马上为对象分配内存,只有在用new关键字创建实例的时候,才会真正分配,所以在声明一个数组变量的时候不需要声明它的大小,只有在实际创建数组的时候才可以指定数组的大小。

foreach语句

1
2
3
4
5
int[] pins = {9, 3, 7, 2};
foreach(int pin in pins)
{
Console.WriteLine(pin);
}

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
2
3
4
int[,] items = new int[4, 6];//声明数组,4行6列
item[2, 4] = 99;
item[2, 4] = item[3, 4];
item[2, 4]++;

集合类

  • ArrayList//类似链表

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ArrayList number = new ArrayList();
    number.Add(1); //添加元素
    number.Insert(number.Count-1, 99); //在索引Count-1处插入元素
    number.Remove(7); //移除值为7的第一个元素
    number.RemoveAt(6); //移除索引为6的元素,即第7个元素
    //使用foreach便利当前的11个元素
    foreach(int number in numbers)
    {
    Console.WriteLine(number);
    }
  • Quene

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Quene numbers = new Quene();
    numbers.Enquene(1); //加入队列
    //遍历队列
    foreach(int number in numbers)
    {

    }

    //出队队列
    number.Dequeue();
  • Stack集合类

    1
    2
    3
    4
    5
    6
    7
    Stack number = new Stack();
    numbers.Push(1); //入栈
    numbers.Pop(); //出栈
    foreach(int number in number)
    {
    Console.WriteLine(number);
    }
  • Hashtable类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Hashtable ages = new Hashtable();
    //填充1
    ages["asa"] = 44;

    //遍历,返回的是DictionaryEntry,它允许通过Key属性和Value属性进行元素访问
    foreach(DictionaryEntry element in ages)
    {
    string name = (string)element.Key;
    int age = (int)element.Value;
    Console.WriteLine("Name: {0}, Age: {1}", name, age);-
    }

C#从入门到放弃3

Posted on 2019-04-25 | In 编程语言
Words count in article: 1.1k | Reading time ≈ 4

C#中的异常处理

1
2
3
4
5
6
7
8
9
10
11
12
try
{

}
catch(Exception e) //Exception是所有异常的基类,即可以捕捉一切异常。
{

}
catch()
{

}

如果一个try抛出异常,但是没有对应的catch处理程序,那么这个方法将立即退出,并返回它的调用方法,如果它的调用方法没有使用try,或者没有找到匹配的catch,那个调用也会退出,返回更上一层。由内向外遍历了所有调用方法之后,假如找不到一个相匹配的catch处理程序,整个程序会终止。
一个异常发生之后,将运行第一个匹配的异常处理程序。

checked和unchecked整数运算

默认情况下C#允许计算悄悄溢出,如果需要,可以启用溢出检查。

1
2
3
4
5
6
//在checked关键字开头的下面代码块中,任何整数运算溢出,都会抛出一个OverflowException,只会检查代码块中的溢出,如果块中出现方法调用,不会对调用的方法进行检查。
checked
{
int willThow = number++;
Console.WriteLine("sss");
}

unchecked相反,在unchecked块中的语句永远不检查。

finally块

1
2
3
4
5
6
7
8
try
{

}
finally
{

}

finally块中的语句一定会执行,一般用于释放资源。

  • C#的类成员访问权限默认是私有的

  • C#中public或者private关键字后不加冒号,每个字段和方法声明必须重复输入public或private关键字

C#小技巧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace Classes
{
class Program
{
static void DoWork()
{
// to do
Point origin = new Point();
}

static void Main(string[] args)
{
try
{
DoWork();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}

可以把任务封装至静态方法dowork,即可捕捉所有异常。

  • C#中访问静态方法使用“类名.”进行调用,静态方法是共享的,又称工具方法,一个静态类中只能存在静态成员。

匿名类

1
var anonymousObject = new(Name = "123", Age = 44);

这个类包含两个Public字段,分别为Name和Age,编译器会根据数据类型进行推断。定义一个匿名类,编译器会为这个类生成一个自己才知道的名称。匿名类只能包含public字段,字段必须全部初始化,而且不能在其中指定方法。

C#中的值类型和引用类型

值类型分配内存,引用类型分配地址指向内存,默认传参对象是引用(地址)。

C#中的可空类型

对于值类型,利用C#定义的一个修饰符,将一个变量声明为可空类型。

1
2
3
4
5
int? i = null;   //声明一个可空类型
int j = 99;
int i = 1;
int i = j; //可以将具有恰当形式的表达式赋值给可空类型
j = i; //不可以将一个可空的值赋值给一个普通的值

ref和out

如果一个参数附加了ref关键字前缀,该参数就会成为实参别名,而不是副本。实参也必须附加ref,使用ref前必须对参数进行初始化。

1
2
3
4
5
6
7
8
9
static void Inc(ref int param)
{
param++;
}
static void Main()
{
int arg = 42;
Inc(ref arg);
}

out关键字与ref类似,向参数的任何操作也会同时应用于实参,out是对output的简称,在传递一个out参数后,必须在方法内部对其赋值。

C#中的装箱

object类是所有类型的基类

1
2
int i = 2;
object o = i;

对于C#来说,一个应用类型都必须引用堆上的数据,在上代码第二行,引用了栈上的i,其实是引用了i在堆上的副本,这种操作为装箱。

C#中的拆箱

1
2
object o = 42;
int i = (int)o;

一个值类型转化为obj类型,那么需要进行强制类型转化,将自动检查obj中的实际类型,不符合会抛出异常。

is操作符

可以用is操作符验证对象类型:

1
2
3
4
5
object o = 42;
if(o is int)
{
int i = (int)o;
}

为了代码的健壮性,在强制类型转换之前可以先判断是否是所需要的类型。

as操作符

1
2
3
4
5
6
object o = 42;
int i = o as int; //尝试类型转换,如果不成功则为null
if(i != null)
{

}

C#中的指针

指针的管理很容易出问题,C#通过引用来解决,如果要使用指针,必须将代码标记为unsafe(不安全)

1
2
3
4
unsafe
{

}

高速铁路列车运行控制技术-1

Posted on 2019-04-25 | In 高速铁路列车运行控制技术
Words count in article: 516 | Reading time ≈ 1

列控系统

对列车运行全部作业过程或部分作业过程实现自动控制的系统,可以根据列车在线路上运行的客观条件和实际情况,对列车的运行速度及制动方式等状态进行监督、控制和调整。

系统特征

列车通过获取地面信息和命令,建立控车曲线,控制列车运行,并调整与前行列车之间必须保持的距离。

列控系统组成

一般包括地面设备、车载设备、数据传输网络、车地信息传输设备。

  • 地面设备提供线路信息、目标距离和进路状态等基本控制信息。
  • 车载设备生成目标距离-连续速度控制模式曲线并实现对列车运行的监控。
  • 数据传输网络实现地面设备间的数据信息交互。
  • 车地信息传输设备用于完成地面设备和车载设备的信息交互。

列控系统的基本目标

保障行车安全、保证运输效率及保证乘客舒适度。

列控系统的基本功能

  1. 线路空闲检测
  2. 危及行车安全因素的检测
  3. 速度控制和间隔控制

闭塞制式

  • 固定闭塞
    列车运行的空间间隔是固定的若干个闭塞区间,闭塞区间的长度按划分的速度等级而定,列车追踪目标点为前行列车所在闭塞分区的始端,后行列车从最高速度开始制动的计算点为要求开始减速的闭塞区间的始端。
  • 准移动闭塞
    列车从最高速度开始制动的计算点是根据目标距离、目标速度及列车本身的性能计算决定的。
  • 虚拟闭塞
    检查设备和轨旁信号机为虚拟的。
  • 移动闭塞
    目标点是前行列车的尾部,后行列车制动点根据目标距离计算决定的。

深入浅出WPF1

Posted on 2019-04-24 | In 编程框架
Words count in article: 611 | Reading time ≈ 2

目录结构

  • Properties:程序要用到的一些资源和配置信息。
  • Reference:标记了当前项目需要引用哪些其他项目。
  • App.xaml:程序主体。
  • Window1.xaml:程序主窗体。

XAML

XAML由XML派生而来,所以很多XML中的概念在XAML中通用。

xmlns

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>

C#中的partial关键字

这个关键字可以把一个类分拆到多处定义,这样在XAML中解析生成的类就可以和C#中的部分合二为一了。partial机制可以把类的逻辑代码留在.cs中,使用C#实现,把UI分离除去。

WPF的树形结构

WPF的框架是树状的,以为节点,一层一层向下包含。
这种树形结构对整个WPF都有非常重要的意义。

XAML对象和属性

1
2
3
4
5
6
7
8
9
10
11
12
13
<Window x:Class="深入浅出WPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
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>
<Rectangle x:Name="rectangle" Width="200" Height="120" Fill="Blue"/> //声明一个Rctangle对象,并设置属性

</Grid>
</Window>

x命名空间

x:class

这个Attribute的作用是告诉XAML编译器将XAML标签的编译结果与后台代码指定的类合并。

x:ClassModifier

类具有怎样的访问控制级别。

x:Name

为这个控件对象创建引用变量,并将对象的Name属性也设置为x:Name的值。

x:FieldModifier

修改引用变量访问级别

x:Key

通过Key检索资源,可以把重复利用资源

x:Shared

通过x:Key检索资源,如果x:Shared为true则检索的是同一对象,为false则为副本。默认为true。

HXD2型电力机车1

Posted on 2019-04-24 | In 机车知识
Words count in article: 1.7k | Reading time ≈ 5

意义

我国能源大部分依靠煤炭,随着经济发展加快,全国煤电油运全面紧张,大幅提高运输能力迫在眉睫,经过论证列车重量提高到2万t,可大幅提高运输能力。

在上述情况下,中国北车集团大同电力机车专门针对重载运输需要研制生产出了最高试验速度132km/h、最高运行速度120km/h、总功率为10MW的HXD2型大功率交流传动货运电力机车。

2006年和谐型大功率交流传动机车诞生及批量投入使用,标志我国铁路机车行业实现了由直流传动向交流传动的转化,机车技术达到世界先进水平。

优势

采用大功率交-直-交传动方式,牵引电机为交流异步电机;牵引变流器采用IGBT器件;采用先进的车载计算机网络控制系统;重载车体、转向架、车钩与缓冲器、轮轴驱动系统以及计算机控制的制动系统充分满足牵引重载列车的需要;司机室按照人体工程学理论设计;轮轨关系、车网关系、车载通讯信号等系统技术与我国铁路基础设施具有良好的匹配性;电力机车的功率因数大于0.98,谐波含量大幅降低;电力机车传动效率大于0.85,同时采用制动能量反馈电网的再生制动方式,节能效果显著;

型号

株洲电力机车:HXD1和HXD1b
大同电力机车:HXD2和HXD2b
大连机车车辆和北京二七轨交交通装备:HXD3
大连机车车辆和:HXD3b和HXN3内燃
戚墅堰机车:HXN5

功率

  • HXD1和HXD2为轴功率1200千瓦的八轴电力机车
  • HXD3为轴功率1200千瓦的六轴电力机车
  • HXD1b,2B,3B为1600千瓦的六轴电力机车
  • HXN3和HXN5都是6000马力等级的内燃机车

HXD2型电力机车概述

针对铁路重载运输而设计。适用于国内大部分线路情况,完全满足国内铁路气候,和煤尘污染严重的环境要求。机车材料在-40低温条件下仍有良好韧性。

机车采用交-直-交电传动系统、25kV/50Hz的电压制式,可实现单机牵引1万t重载列车,通过远程重联可实现双机牵引2万t重载组合列车的运行模式。

机车主要子系统

  • 由受电工、真空主断路器、避雷器、高压隔离开关、高压电压互感器、高压电流互感器、主变压器、IGBT四象限整流逆变装置、交流异步电机等组成的主电路系统。
  • 由辅助变流装置、充电器、辅助电机等构成的辅助电路系统。
  • 基于WorldFIP网络通信技术的微机网络控制控制系统。
  • Eurotrol电空制动系统。
  • 贯穿在各子系统内的独立通风冷却系统。
  • 由机车运行监控装置、信号设备、Locotrol远程重联控制装置和可控列尾装置、无线电台等组成的列车安全运行控制和检测设备。
  • 高强度车体及附属装置。
  • 高黏着、低动力作用转向架。
  • 机车独立生活间、工具柜、压车铁等附属装置。

在机车的标准配置中,机车整备重量为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组成。

WorldFIP网络通信的原理和结构

分级

FIP车辆网(FIPV)

车辆级通信使用该网络,主要有主处理单元MPU、远程输入输出模块RIOMcar、牵引控制单元TCU、辅助控制单元ACU、制动控制单元BCU、司机显示单元DDU。
每节列车的FIPV采用两路介质冗余设置,以保证网络通信的正常。

FIPV网的主要特点

  1. 每节机车都拥有一个带冗余介质的FIPV网,HXD2有两节机车,有两套相互独立的FIPV网。
  2. FIPV网是一个静态地址网,需要人为设置地址进行通信。
  3. FIPV网是一个冗余功能的网络,使用双线介质冗余方案。
  4. FIPV网最多允许接入的节点是32个。
  5. FIPV网和一套主控一套从控装置一起工作,主控设备具有总线仲裁功能(BA),FIPV采用双总线仲裁器冗余方式。
  6. 总线仲裁器功能由MPU管理(主MPU负责计算机冗余管理)。
  7. FIPV网采用变压器隔离。
  8. FIPV网的传输速度为铁路机车车辆的专用速率1Mbit/s。
  9. FIPV采用曼彻斯特编码。
  10. FIPV网络使用一个16位的多项式CRC校验。
  11. FIPV网的交换周期为40ms。
  12. FIPV网的总线电阻120欧。
  13. FIPV网的主控设备为MPU1或MPU2。
  14. FIPV网的网络终端放置有终端电阻,可以使网络终端匹配电缆的阻抗特性、固定导线的电势和消除对线路的影响。
  15. 可以使用反射仪来检验机车FIPV网络的质量。

FIPV网的信息类型

FIPV网的接入只有总线仲裁器管理。交换信息包括周期性变量和非周期信息。

  • 对于周期性数据,其大小在1~128字节之间,数据在预定的时间传送到网络,以安排数据交换。
  • 对于非周期性数据,在周期性数据交换的网络空闲时间内转送,数据大小不超过256字节,通过点到点识别。

FIPV网的传输介质

有冗余设计:

  • 对于生产者,所有数据按两种介质系统发送。
  • 对于消费者,考虑第一个到达的数据。
  • 有重传机制,失效后将被重制为安全值。

数据的传输有效性

除了CRC校验,还有数据状态。

  • 敏感机制:检测数据是否超时,通知消费者数据以及很久没更新了,此时消费者使用安全值。
  • 刷新机制:生产者的数据发送到FIPV网络前可以由应用软件更新。

FIPV网络地址

P185

C#从入门到放弃2

Posted on 2019-04-23 | In 编程语言
Words count in article: 268 | Reading time ≈ 1

C#变量赋值

1
2
float variable;
variable = 0.42F;

如果忘记添加F后缀,那么0.42被视为一个double,在C#中不通过其他方式不能将一种类型变量赋值给另外一种。

控件相关

textbox内值为字符串

在C#中可以用’+’拼接字符串

1
2
//拼接43和1,得到431
Console.WriteLine("43"+"1");

C#中5.0/0.0为infinity.0.0/0.0为NAN

C#中可以对float和double取模,7.0%2.4=2.2

C#通过视图->其他窗口->文档大纲可以看到窗体上所有控件的名称和类型,为控件选择提高了效率。

数值转换

1
2
int num = int.Parse(str); //将字符串解析为int数据
num.ToString(); //将数字解析成字符串

C#类型推断

1
2
var num = 99;
var num = "hello";

只有初始化变量时才能使用关键字var

C#不支持全局方法,所有方法必须在一个类的内部

C#折叠代码

1
2
3
4
#region "名称"
... ...
... ...
#endregion

C#支持命名参数

1
2
void optMethod(int arg1, double arg2);
optMethof(arg2:43.2,arg1:1);
123

Marsxck

29 posts
12 categories
26 tags
RSS
GitHub E-Mail
© 2019 Marsxck | Site words total count: 20.1k
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4