|
@@ -161,7 +161,7 @@ class ServoSizer {
|
|
|
getParameterForm(type) {
|
|
getParameterForm(type) {
|
|
|
const forms = {
|
|
const forms = {
|
|
|
ballscrew: `
|
|
ballscrew: `
|
|
|
- <h4>滚珠丝杠参数</h4>
|
|
|
|
|
|
|
+ <h4>丝杠参数</h4>
|
|
|
<div class="form-group">
|
|
<div class="form-group">
|
|
|
<label for="screwDiameter">丝杠直径 (mm):</label>
|
|
<label for="screwDiameter">丝杠直径 (mm):</label>
|
|
|
<input type="number" id="screwDiameter" class="form-control" value="20" min="1" step="0.1">
|
|
<input type="number" id="screwDiameter" class="form-control" value="20" min="1" step="0.1">
|
|
@@ -186,6 +186,14 @@ class ServoSizer {
|
|
|
<label for="accelerationTime">加速时间 (s):</label>
|
|
<label for="accelerationTime">加速时间 (s):</label>
|
|
|
<input type="number" id="accelerationTime" class="form-control" value="0.5" min="0.01" step="0.01">
|
|
<input type="number" id="accelerationTime" class="form-control" value="0.5" min="0.01" step="0.01">
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+ <div class="form-group">
|
|
|
|
|
+ <label for="frictionCoeff">摩擦系数:</label>
|
|
|
|
|
+ <input type="number" id="frictionCoeff" class="form-control" value="0.01" min="0" max="1" step="0.001">
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="form-group">
|
|
|
|
|
+ <label for="efficiency">传动效率:</label>
|
|
|
|
|
+ <input type="number" id="efficiency" class="form-control" value="0.9" min="0.1" max="1" step="0.01">
|
|
|
|
|
+ </div>
|
|
|
`,
|
|
`,
|
|
|
timingBelt: `
|
|
timingBelt: `
|
|
|
<h4>同步带参数</h4>
|
|
<h4>同步带参数</h4>
|
|
@@ -205,6 +213,14 @@ class ServoSizer {
|
|
|
<label for="accelerationTime">加速时间 (s):</label>
|
|
<label for="accelerationTime">加速时间 (s):</label>
|
|
|
<input type="number" id="accelerationTime" class="form-control" value="0.3" min="0.01" step="0.01">
|
|
<input type="number" id="accelerationTime" class="form-control" value="0.3" min="0.01" step="0.01">
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+ <div class="form-group">
|
|
|
|
|
+ <label for="frictionCoeff">摩擦系数:</label>
|
|
|
|
|
+ <input type="number" id="frictionCoeff" class="form-control" value="0.02" min="0" max="1" step="0.001">
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="form-group">
|
|
|
|
|
+ <label for="efficiency">传动效率:</label>
|
|
|
|
|
+ <input type="number" id="efficiency" class="form-control" value="0.95" min="0.1" max="1" step="0.01">
|
|
|
|
|
+ </div>
|
|
|
`,
|
|
`,
|
|
|
gearbox: `
|
|
gearbox: `
|
|
|
<h4>减速机参数</h4>
|
|
<h4>减速机参数</h4>
|
|
@@ -228,6 +244,10 @@ class ServoSizer {
|
|
|
<label for="accelerationTime">加速时间 (s):</label>
|
|
<label for="accelerationTime">加速时间 (s):</label>
|
|
|
<input type="number" id="accelerationTime" class="form-control" value="0.2" min="0.01" step="0.01">
|
|
<input type="number" id="accelerationTime" class="form-control" value="0.2" min="0.01" step="0.01">
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+ <div class="form-group">
|
|
|
|
|
+ <label for="efficiency">传动效率:</label>
|
|
|
|
|
+ <input type="number" id="efficiency" class="form-control" value="0.9" min="0.1" max="1" step="0.01">
|
|
|
|
|
+ </div>
|
|
|
`,
|
|
`,
|
|
|
rotaryTable: `
|
|
rotaryTable: `
|
|
|
<h4>转盘参数</h4>
|
|
<h4>转盘参数</h4>
|
|
@@ -247,6 +267,14 @@ class ServoSizer {
|
|
|
<label for="accelerationTime">加速时间 (s):</label>
|
|
<label for="accelerationTime">加速时间 (s):</label>
|
|
|
<input type="number" id="accelerationTime" class="form-control" value="1.0" min="0.01" step="0.01">
|
|
<input type="number" id="accelerationTime" class="form-control" value="1.0" min="0.01" step="0.01">
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+ <div class="form-group">
|
|
|
|
|
+ <label for="frictionCoeff">摩擦系数:</label>
|
|
|
|
|
+ <input type="number" id="frictionCoeff" class="form-control" value="0.01" min="0" max="1" step="0.001">
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="form-group">
|
|
|
|
|
+ <label for="efficiency">传动效率:</label>
|
|
|
|
|
+ <input type="number" id="efficiency" class="form-control" value="0.95" min="0.1" max="1" step="0.01">
|
|
|
|
|
+ </div>
|
|
|
`,
|
|
`,
|
|
|
winder: `
|
|
winder: `
|
|
|
<h4>收放卷参数</h4>
|
|
<h4>收放卷参数</h4>
|
|
@@ -278,6 +306,10 @@ class ServoSizer {
|
|
|
<label for="accelerationTime">加速时间 (s):</label>
|
|
<label for="accelerationTime">加速时间 (s):</label>
|
|
|
<input type="number" id="accelerationTime" class="form-control" value="0.5" min="0.01" step="0.01">
|
|
<input type="number" id="accelerationTime" class="form-control" value="0.5" min="0.01" step="0.01">
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+ <div class="form-group">
|
|
|
|
|
+ <label for="efficiency">传动效率:</label>
|
|
|
|
|
+ <input type="number" id="efficiency" class="form-control" value="0.85" min="0.1" max="1" step="0.01">
|
|
|
|
|
+ </div>
|
|
|
`,
|
|
`,
|
|
|
directDrive: `
|
|
directDrive: `
|
|
|
<h4>直接驱动参数</h4>
|
|
<h4>直接驱动参数</h4>
|
|
@@ -297,13 +329,16 @@ class ServoSizer {
|
|
|
<label for="accelerationTime">加速时间 (s):</label>
|
|
<label for="accelerationTime">加速时间 (s):</label>
|
|
|
<input type="number" id="accelerationTime" class="form-control" value="0.1" min="0.01" step="0.01">
|
|
<input type="number" id="accelerationTime" class="form-control" value="0.1" min="0.01" step="0.01">
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+ <!-- 直接驱动通常没有传动效率和摩擦系数,使用默认值 -->
|
|
|
|
|
+ <input type="hidden" id="frictionCoeff" value="0.0">
|
|
|
|
|
+ <input type="hidden" id="efficiency" value="1.0">
|
|
|
`,
|
|
`,
|
|
|
combined: `
|
|
combined: `
|
|
|
<h4>组合传动参数</h4>
|
|
<h4>组合传动参数</h4>
|
|
|
<div class="form-group">
|
|
<div class="form-group">
|
|
|
<label for="primaryType">主要传动类型:</label>
|
|
<label for="primaryType">主要传动类型:</label>
|
|
|
<select id="primaryType" class="form-control">
|
|
<select id="primaryType" class="form-control">
|
|
|
- <option value="ballscrew">滚珠丝杠</option>
|
|
|
|
|
|
|
+ <option value="ballscrew">丝杠</option>
|
|
|
<option value="timingBelt">同步带</option>
|
|
<option value="timingBelt">同步带</option>
|
|
|
<option value="gearbox">减速机</option>
|
|
<option value="gearbox">减速机</option>
|
|
|
</select>
|
|
</select>
|
|
@@ -327,6 +362,14 @@ class ServoSizer {
|
|
|
<label for="accelerationTime">加速时间 (s):</label>
|
|
<label for="accelerationTime">加速时间 (s):</label>
|
|
|
<input type="number" id="accelerationTime" class="form-control" value="0.4" min="0.01" step="0.01">
|
|
<input type="number" id="accelerationTime" class="form-control" value="0.4" min="0.01" step="0.01">
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+ <div class="form-group">
|
|
|
|
|
+ <label for="frictionCoeff">摩擦系数:</label>
|
|
|
|
|
+ <input type="number" id="frictionCoeff" class="form-control" value="0.015" min="0" max="1" step="0.001">
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="form-group">
|
|
|
|
|
+ <label for="efficiency">传动效率:</label>
|
|
|
|
|
+ <input type="number" id="efficiency" class="form-control" value="0.85" min="0.1" max="1" step="0.01">
|
|
|
|
|
+ </div>
|
|
|
`
|
|
`
|
|
|
};
|
|
};
|
|
|
return forms[type] || forms.ballscrew;
|
|
return forms[type] || forms.ballscrew;
|
|
@@ -352,7 +395,7 @@ class ServoSizer {
|
|
|
return isNaN(num) || !isFinite(num) ? defaultValue : num;
|
|
return isNaN(num) || !isFinite(num) ? defaultValue : num;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 滚珠丝杠计算
|
|
|
|
|
|
|
+ // 丝杠计算
|
|
|
calculateBallScrew(params) {
|
|
calculateBallScrew(params) {
|
|
|
const {
|
|
const {
|
|
|
loadMass, screwDiameter, screwLead, frictionCoeff, efficiency,
|
|
loadMass, screwDiameter, screwLead, frictionCoeff, efficiency,
|
|
@@ -382,7 +425,7 @@ class ServoSizer {
|
|
|
const maxRpm = (speed * 60) / (lead * 1000); // mm/s to rpm
|
|
const maxRpm = (speed * 60) / (lead * 1000); // mm/s to rpm
|
|
|
|
|
|
|
|
// 3. 惯量计算
|
|
// 3. 惯量计算
|
|
|
- // 滚珠丝杠惯量 (实心圆柱体)
|
|
|
|
|
|
|
+ // 丝杠惯量 (实心圆柱体)
|
|
|
const screwInertia = (Math.PI * 7800 * Math.pow(diameter, 4) * travel) / 32;
|
|
const screwInertia = (Math.PI * 7800 * Math.pow(diameter, 4) * travel) / 32;
|
|
|
// 负载折算到电机轴的惯量
|
|
// 负载折算到电机轴的惯量
|
|
|
const loadInertia = mass * Math.pow(lead / (2 * Math.PI), 2);
|
|
const loadInertia = mass * Math.pow(lead / (2 * Math.PI), 2);
|
|
@@ -648,13 +691,9 @@ class ServoSizer {
|
|
|
// 获取通用参数
|
|
// 获取通用参数
|
|
|
const safetyFactorEl = document.getElementById('safetyFactor');
|
|
const safetyFactorEl = document.getElementById('safetyFactor');
|
|
|
const inertiaRatioEl = document.getElementById('inertiaRatio');
|
|
const inertiaRatioEl = document.getElementById('inertiaRatio');
|
|
|
- const frictionCoeffEl = document.getElementById('frictionCoeff');
|
|
|
|
|
- const efficiencyEl = document.getElementById('efficiency');
|
|
|
|
|
|
|
|
|
|
if (safetyFactorEl) values.safetyFactor = this.safeNumber(safetyFactorEl.value, 1.5);
|
|
if (safetyFactorEl) values.safetyFactor = this.safeNumber(safetyFactorEl.value, 1.5);
|
|
|
if (inertiaRatioEl) values.inertiaRatio = this.safeNumber(inertiaRatioEl.value, 10);
|
|
if (inertiaRatioEl) values.inertiaRatio = this.safeNumber(inertiaRatioEl.value, 10);
|
|
|
- if (frictionCoeffEl) values.frictionCoeff = this.safeNumber(frictionCoeffEl.value, 0.01);
|
|
|
|
|
- if (efficiencyEl) values.efficiency = this.safeNumber(efficiencyEl.value, 0.9);
|
|
|
|
|
|
|
|
|
|
return values;
|
|
return values;
|
|
|
}
|
|
}
|
|
@@ -929,7 +968,45 @@ class ServoSizer {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// 主题切换功能
|
|
|
|
|
+function toggleTheme() {
|
|
|
|
|
+ const body = document.body;
|
|
|
|
|
+ const themeToggle = document.getElementById('themeToggle');
|
|
|
|
|
+
|
|
|
|
|
+ if (body.classList.contains('dark-mode')) {
|
|
|
|
|
+ body.classList.remove('dark-mode');
|
|
|
|
|
+ localStorage.setItem('theme', 'light');
|
|
|
|
|
+ themeToggle.innerHTML = '<span class="theme-icon">🌙</span>';
|
|
|
|
|
+ } else {
|
|
|
|
|
+ body.classList.add('dark-mode');
|
|
|
|
|
+ localStorage.setItem('theme', 'dark');
|
|
|
|
|
+ themeToggle.innerHTML = '<span class="theme-icon">☀️</span>';
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 初始化主题
|
|
|
|
|
+function initTheme() {
|
|
|
|
|
+ const savedTheme = localStorage.getItem('theme') || 'light';
|
|
|
|
|
+ const body = document.body;
|
|
|
|
|
+ const themeToggle = document.getElementById('themeToggle');
|
|
|
|
|
+
|
|
|
|
|
+ if (savedTheme === 'dark') {
|
|
|
|
|
+ body.classList.add('dark-mode');
|
|
|
|
|
+ if (themeToggle) themeToggle.innerHTML = '<span class="theme-icon">☀️</span>';
|
|
|
|
|
+ } else {
|
|
|
|
|
+ body.classList.remove('dark-mode');
|
|
|
|
|
+ if (themeToggle) themeToggle.innerHTML = '<span class="theme-icon">🌙</span>';
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// 初始化应用 - 确保在 DOM 加载完成后执行
|
|
// 初始化应用 - 确保在 DOM 加载完成后执行
|
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
|
new ServoSizer();
|
|
new ServoSizer();
|
|
|
|
|
+ initTheme();
|
|
|
|
|
+
|
|
|
|
|
+ // 绑定主题切换按钮事件
|
|
|
|
|
+ const themeToggle = document.getElementById('themeToggle');
|
|
|
|
|
+ if (themeToggle) {
|
|
|
|
|
+ themeToggle.addEventListener('click', toggleTheme);
|
|
|
|
|
+ }
|
|
|
});
|
|
});
|